swift 0.8.1 → 0.9.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 +6 -6
- data/VERSION +1 -1
- data/ext/result.cc +1 -1
- data/lib/swift/adapter.rb +86 -58
- data/lib/swift/scheme.rb +8 -9
- data/swift.gemspec +2 -2
- data/test/test_scheme.rb +1 -1
- data/test/test_types.rb +2 -2
- metadata +4 -4
data/API.rdoc
CHANGED
|
@@ -16,15 +16,15 @@ Public API minus the optional stuff like Pool, IdentityMap, Migrations etc.
|
|
|
16
16
|
#all #=> Result
|
|
17
17
|
#begin #=> Adapter
|
|
18
18
|
#commit
|
|
19
|
-
#create #=> Scheme
|
|
20
|
-
#destroy #=> Result
|
|
19
|
+
#create #=> Scheme or Result
|
|
20
|
+
#destroy #=> Scheme or Result
|
|
21
21
|
#execute #=> Result
|
|
22
22
|
#first #=> Scheme
|
|
23
23
|
#get #=> Scheme
|
|
24
24
|
#prepare #=> Statement
|
|
25
25
|
#rollback
|
|
26
26
|
#transaction #=> Adapter
|
|
27
|
-
#update #=> Result
|
|
27
|
+
#update #=> Scheme or Result
|
|
28
28
|
#reconnect
|
|
29
29
|
#delete #=> Result
|
|
30
30
|
|
|
@@ -50,7 +50,7 @@ Public API minus the optional stuff like Pool, IdentityMap, Migrations etc.
|
|
|
50
50
|
Scheme
|
|
51
51
|
.all #=> Result
|
|
52
52
|
.attribute #=> Type
|
|
53
|
-
.create #=> Scheme
|
|
53
|
+
.create #=> Scheme or Result
|
|
54
54
|
.first #=> Scheme
|
|
55
55
|
.get #=> Scheme
|
|
56
56
|
.header #=> Header
|
|
@@ -58,9 +58,9 @@ Public API minus the optional stuff like Pool, IdentityMap, Migrations etc.
|
|
|
58
58
|
.new #=> Scheme
|
|
59
59
|
.scheme #=> Alias for self.class
|
|
60
60
|
.store #=> Symbol
|
|
61
|
-
#destroy #=> Result
|
|
61
|
+
#destroy #=> Scheme or Result
|
|
62
62
|
#tuple #=> Hash
|
|
63
|
-
#update #=> Result
|
|
63
|
+
#update #=> Scheme or Result
|
|
64
64
|
|
|
65
65
|
# Enumerable collection of Types for Scheme
|
|
66
66
|
Header
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.9.0
|
data/ext/result.cc
CHANGED
data/lib/swift/adapter.rb
CHANGED
|
@@ -25,8 +25,8 @@ module Swift
|
|
|
25
25
|
#--
|
|
26
26
|
# NOTE: Not significantly shorter than Scheme.db.first(User, 'id = ?', 12)
|
|
27
27
|
def get scheme, keys
|
|
28
|
-
|
|
29
|
-
prepare_get(scheme).execute(*
|
|
28
|
+
resource = scheme.new(keys)
|
|
29
|
+
prepare_get(scheme).execute(*resource.tuple.values_at(*scheme.header.keys)).first
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
# Select one or more.
|
|
@@ -73,32 +73,58 @@ module Swift
|
|
|
73
73
|
prepare(scheme, "select * from #{scheme.store} #{where} limit 1").execute(*binds, &block).first
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
+
# Delete one or more.
|
|
77
|
+
#
|
|
78
|
+
# The SQL condition form of Swift::Adapter.destroy.
|
|
79
|
+
#
|
|
80
|
+
# @example All.
|
|
81
|
+
# Swift.db.delete(User)
|
|
82
|
+
# @example All with conditions and binds.
|
|
83
|
+
# Swift.db.delete(User, ':name = ? and :age > ?', 'Apple Arthurton', 32)
|
|
84
|
+
#
|
|
85
|
+
# @param [Swift::Scheme] scheme Concrete scheme subclass
|
|
86
|
+
# @param [String] conditions Optional SQL 'where' fragment.
|
|
87
|
+
# @param [Object, ...] *binds Optional bind values that accompany conditions SQL fragment.
|
|
88
|
+
# @return [Swift::Result]
|
|
89
|
+
def delete scheme, conditions = '', *binds
|
|
90
|
+
sql = "delete from #{scheme.store}"
|
|
91
|
+
sql += " where #{exchange_names(scheme, conditions)}" unless conditions.empty?
|
|
92
|
+
execute(sql, *binds)
|
|
93
|
+
end
|
|
94
|
+
|
|
76
95
|
# Create one or more.
|
|
77
96
|
#
|
|
78
97
|
# @example Scheme.
|
|
79
98
|
# user = User.new(name: 'Apply Arthurton', age: 32)
|
|
80
99
|
# Swift.db.create(User, user)
|
|
100
|
+
# #=> Swift::Scheme
|
|
81
101
|
# @example Coerce hash to scheme.
|
|
82
102
|
# Swif.db.create(User, name: 'Apple Arthurton', age: 32)
|
|
83
|
-
#
|
|
103
|
+
# #=> Swift::Scheme
|
|
104
|
+
# @example Multiple resources.
|
|
84
105
|
# apple = User.new(name: 'Apple Arthurton', age: 32)
|
|
85
106
|
# benny = User.new(name: 'Benny Arthurton', age: 30)
|
|
86
|
-
# Swift.db.create(User, apple, benny)
|
|
87
|
-
#
|
|
88
|
-
#
|
|
107
|
+
# Swift.db.create(User, [apple, benny])
|
|
108
|
+
# #=> Array<Swift::Scheme>
|
|
109
|
+
# @example Coerce multiple resources.
|
|
110
|
+
# Swift.db.create(User, [{name: 'Apple Arthurton', age: 32}, {name: 'Benny Arthurton', age: 30}])
|
|
111
|
+
# #=> Array<Swift::Scheme>
|
|
89
112
|
#
|
|
90
|
-
# @param [Swift::Scheme]
|
|
91
|
-
# @param [Swift::Scheme, Hash
|
|
92
|
-
# @return [Array<Swift::Scheme>]
|
|
113
|
+
# @param [Swift::Scheme] scheme Concrete scheme subclass to load.
|
|
114
|
+
# @param [Swift::Scheme, Hash, Array<Swift::Scheme, Hash>] resources The resources to be saved.
|
|
115
|
+
# @return [Swift::Scheme, Array<Swift::Scheme>]
|
|
116
|
+
# @note Hashes will be coerced into a Swift::Scheme resource via Swift::Scheme#new
|
|
117
|
+
# @note Passing a scalar will result in a scalar.
|
|
93
118
|
# @see Swift::Scheme.create
|
|
94
|
-
def create scheme,
|
|
119
|
+
def create scheme, resources
|
|
95
120
|
statement = prepare_create(scheme)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
result = statement.execute(*
|
|
99
|
-
|
|
100
|
-
|
|
121
|
+
result = [resources].flatten.map do |resource|
|
|
122
|
+
resource = scheme.new(resource) unless resource.kind_of?(scheme)
|
|
123
|
+
result = statement.execute(*resource.tuple.values_at(*scheme.header.insertable))
|
|
124
|
+
resource.tuple[scheme.header.serial] = result.insert_id if scheme.header.serial
|
|
125
|
+
resource
|
|
101
126
|
end
|
|
127
|
+
resources.kind_of?(Enumerable) ? result : result.first
|
|
102
128
|
end
|
|
103
129
|
|
|
104
130
|
# Update one or more.
|
|
@@ -107,32 +133,43 @@ module Swift
|
|
|
107
133
|
# user = Swift.db.create(User, name: 'Apply Arthurton', age: 32)
|
|
108
134
|
# user.name = 'Arthur Appleton'
|
|
109
135
|
# Swift.db.update(User, user)
|
|
136
|
+
# #=> Swift::Scheme
|
|
110
137
|
# @example Coerce hash to scheme.
|
|
111
138
|
# user = Swift.db.create(User, name: 'Apply Arthurton', age: 32)
|
|
112
139
|
# user.name = 'Arthur Appleton'
|
|
113
140
|
# Swif.db.update(User, user.tuple)
|
|
114
|
-
#
|
|
141
|
+
# #=> Swift::Scheme
|
|
142
|
+
# @example Multiple resources.
|
|
115
143
|
# apple = Swift.db.create(User, name: 'Apple Arthurton', age: 32)
|
|
116
144
|
# benny = Swift.db.create(User, name: 'Benny Arthurton', age: 30)
|
|
117
|
-
# Swift.db.update(User, apple, benny)
|
|
118
|
-
#
|
|
145
|
+
# Swift.db.update(User, [apple, benny])
|
|
146
|
+
# #=> Array<Swift::Scheme>
|
|
147
|
+
# @example Coerce multiple resources.
|
|
119
148
|
# apple = Swift.db.create(User, name: 'Apple Arthurton', age: 32)
|
|
120
149
|
# benny = Swift.db.create(User, name: 'Benny Arthurton', age: 30)
|
|
121
|
-
# Swift.db.update(User, apple.tuple, benny.tuple)
|
|
150
|
+
# Swift.db.update(User, [apple.tuple, benny.tuple])
|
|
151
|
+
# #=> Array<Swift::Scheme>
|
|
122
152
|
#
|
|
123
|
-
# @param [Swift::Scheme]
|
|
124
|
-
# @param [Swift::Scheme, Hash
|
|
125
|
-
# @return [
|
|
153
|
+
# @param [Swift::Scheme] scheme Concrete scheme subclass to load.
|
|
154
|
+
# @param [Swift::Scheme, Hash, Array<Swift::Scheme, Hash>] resources The resources to be updated.
|
|
155
|
+
# @return [Swift::Scheme, Swift::Result<Swift::Scheme>]
|
|
156
|
+
# @note Hashes will be coerced into a Swift::Scheme resource via Swift::Scheme#new
|
|
157
|
+
# @note Passing a scalar will result in a scalar.
|
|
126
158
|
# @see Swift::Scheme#update
|
|
127
|
-
def update scheme,
|
|
159
|
+
def update scheme, resources
|
|
128
160
|
statement = prepare_update(scheme)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
keys =
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
161
|
+
result = [resources].flatten.map do |resource|
|
|
162
|
+
resource = scheme.new(resource) unless resource.kind_of?(scheme)
|
|
163
|
+
keys = resource.tuple.values_at(*scheme.header.keys)
|
|
164
|
+
|
|
165
|
+
# TODO: Name the key field(s) missing.
|
|
166
|
+
raise ArgumentError, "#{scheme} resource has incomplete key: #{resource.inspect}" \
|
|
167
|
+
unless keys.select(&:nil?).empty?
|
|
168
|
+
|
|
169
|
+
statement.execute(*resource.tuple.values_at(*scheme.header.updatable), *keys)
|
|
170
|
+
resource
|
|
135
171
|
end
|
|
172
|
+
resources.kind_of?(Enumerable) ? result : result.first
|
|
136
173
|
end
|
|
137
174
|
|
|
138
175
|
# Destroy one or more.
|
|
@@ -145,49 +182,40 @@ module Swift
|
|
|
145
182
|
# user = Swift.db.create(User, name: 'Apply Arthurton', age: 32)
|
|
146
183
|
# user.name = 'Arthur Appleton'
|
|
147
184
|
# Swif.db.destroy(User, user.tuple)
|
|
148
|
-
# @example Multiple
|
|
185
|
+
# @example Multiple resources.
|
|
149
186
|
# apple = Swift.db.create(User, name: 'Apple Arthurton', age: 32)
|
|
150
187
|
# benny = Swift.db.create(User, name: 'Benny Arthurton', age: 30)
|
|
151
|
-
# Swift.db.destroy(User, apple, benny)
|
|
152
|
-
# @example Coerce multiple
|
|
188
|
+
# Swift.db.destroy(User, [apple, benny])
|
|
189
|
+
# @example Coerce multiple resources.
|
|
153
190
|
# apple = Swift.db.create(User, name: 'Apple Arthurton', age: 32)
|
|
154
191
|
# benny = Swift.db.create(User, name: 'Benny Arthurton', age: 30)
|
|
155
|
-
# Swift.db.destroy(User, apple.tuple, benny.tuple)
|
|
192
|
+
# Swift.db.destroy(User, [apple.tuple, benny.tuple])
|
|
156
193
|
#
|
|
157
|
-
# @param [Swift::Scheme]
|
|
158
|
-
# @param [Swift::Scheme, Hash
|
|
194
|
+
# @param [Swift::Scheme] scheme Concrete scheme subclass to load.
|
|
195
|
+
# @param [Swift::Scheme, Hash, Array<Swift::Scheme, Hash>] resources The resources to be destroyed.
|
|
196
|
+
# @return [Swift::Scheme, Array<Swift::Scheme>]
|
|
197
|
+
# @note Hashes will be coerced into a Swift::Scheme resource via Swift::Scheme#new
|
|
198
|
+
# @note Passing a scalar will result in a scalar.
|
|
159
199
|
# @see Swift::Scheme#destroy
|
|
160
|
-
def destroy scheme,
|
|
200
|
+
def destroy scheme, resources
|
|
161
201
|
statement = prepare_destroy(scheme)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
keys =
|
|
165
|
-
|
|
202
|
+
result = [resources].flatten.map do |resource|
|
|
203
|
+
resource = scheme.new(resource) unless resource.kind_of?(scheme)
|
|
204
|
+
keys = resource.tuple.values_at(*scheme.header.keys)
|
|
205
|
+
|
|
206
|
+
# TODO: Name the key field(s) missing.
|
|
207
|
+
raise ArgumentError, "#{scheme} resource has incomplete key: #{resource.inspect}" \
|
|
208
|
+
unless keys.select(&:nil?).empty?
|
|
209
|
+
|
|
166
210
|
if result = statement.execute(*keys)
|
|
167
|
-
|
|
211
|
+
resource.freeze
|
|
168
212
|
end
|
|
169
213
|
result
|
|
170
214
|
end
|
|
215
|
+
resources.kind_of?(Enumerable) ? result : result.first
|
|
171
216
|
end
|
|
172
217
|
|
|
173
218
|
|
|
174
|
-
# Delete one or more rows
|
|
175
|
-
#
|
|
176
|
-
# @example All.
|
|
177
|
-
# Swift.db.delete(User)
|
|
178
|
-
# @example All with conditions and binds.
|
|
179
|
-
# Swift.db.delete(User, ':name = ? and :age > ?', 'Apple Arthurton', 32)
|
|
180
|
-
#
|
|
181
|
-
# @param [Swift::Scheme] scheme Concrete scheme subclass
|
|
182
|
-
# @param [String] conditions Optional SQL 'where' fragment.
|
|
183
|
-
# @param [Object, ...] *binds Optional bind values that accompany conditions SQL fragment.
|
|
184
|
-
# @return [Swift::Result]
|
|
185
|
-
def delete scheme, conditions = '', *binds
|
|
186
|
-
sql = "delete from #{scheme.store}"
|
|
187
|
-
sql += " where #{exchange_names(scheme, conditions)}" unless conditions.empty?
|
|
188
|
-
execute(sql, *binds)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
219
|
def migrate! scheme
|
|
192
220
|
keys = scheme.header.keys
|
|
193
221
|
fields = scheme.header.map{|p| field_definition(p)}.join(', ')
|
data/lib/swift/scheme.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Swift
|
|
2
2
|
|
|
3
|
-
# A
|
|
3
|
+
# A resource (instance) definition.
|
|
4
4
|
#
|
|
5
5
|
# @example A user scheme.
|
|
6
6
|
# class User < Swift::Scheme
|
|
@@ -10,8 +10,6 @@ module Swift
|
|
|
10
10
|
# attribute :email, Swift::Type::String
|
|
11
11
|
# attribute :updated_at, Swift::Type::Time
|
|
12
12
|
# end # User
|
|
13
|
-
#
|
|
14
|
-
# @todo Tuple should be renamed tuples (plural?)
|
|
15
13
|
class Scheme
|
|
16
14
|
attr_accessor :tuple
|
|
17
15
|
alias_method :scheme, :class
|
|
@@ -22,7 +20,7 @@ module Swift
|
|
|
22
20
|
# email: 'apple@arthurton.local',
|
|
23
21
|
# updated_at: Time.now
|
|
24
22
|
# )
|
|
25
|
-
# @param [Hash] options Create
|
|
23
|
+
# @param [Hash] options Create resource and set attributes. <tt>{name: value}</tt>
|
|
26
24
|
def initialize options = {}
|
|
27
25
|
@tuple = scheme.header.new_tuple
|
|
28
26
|
options.each{|k, v| send(:"#{k}=", v)}
|
|
@@ -49,8 +47,8 @@ module Swift
|
|
|
49
47
|
# updated_at: Time.now
|
|
50
48
|
# )
|
|
51
49
|
# apple.destroy
|
|
52
|
-
def destroy
|
|
53
|
-
Swift.db.destroy(scheme,
|
|
50
|
+
def destroy resources = self
|
|
51
|
+
Swift.db.destroy(scheme, resources)
|
|
54
52
|
end
|
|
55
53
|
|
|
56
54
|
class << self
|
|
@@ -62,6 +60,7 @@ module Swift
|
|
|
62
60
|
def inherited klass
|
|
63
61
|
klass.header = Header.new
|
|
64
62
|
klass.header.push(*header) if header
|
|
63
|
+
klass.store store if store
|
|
65
64
|
Swift.schema.push(klass) if klass.name
|
|
66
65
|
end
|
|
67
66
|
|
|
@@ -96,9 +95,9 @@ module Swift
|
|
|
96
95
|
# updated_at: Time.now
|
|
97
96
|
# )
|
|
98
97
|
#
|
|
99
|
-
# @param [Hash] options Create with attributes. <tt>{name: value}</tt>
|
|
100
|
-
def create
|
|
101
|
-
Swift.db.create(self,
|
|
98
|
+
# @param [Hash, Array<Hash>] options Create with attributes. <tt>{name: value}</tt>
|
|
99
|
+
def create resources = {}
|
|
100
|
+
Swift.db.create(self, resources)
|
|
102
101
|
end
|
|
103
102
|
|
|
104
103
|
# Select by id(s).
|
data/swift.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{swift}
|
|
8
|
-
s.version = "0.
|
|
8
|
+
s.version = "0.9.0"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Shane Hanna", "Bharanee 'Barney' Rathna"]
|
|
12
|
-
s.date = %q{2011-
|
|
12
|
+
s.date = %q{2011-02-10}
|
|
13
13
|
s.description = %q{A rational rudimentary database abstraction.}
|
|
14
14
|
s.email = ["shane.hanna@gmail.com", "deepfryed@gmail.com"]
|
|
15
15
|
s.extensions = ["ext/extconf.rb"]
|
data/test/test_scheme.rb
CHANGED
|
@@ -78,7 +78,7 @@ describe 'scheme' do
|
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
it 'adapter should delete only relevant rows given condition & scheme' do
|
|
81
|
-
Swift.db.create(@user, {name: 'dave'}, {name: 'mike'})
|
|
81
|
+
Swift.db.create(@user, [{name: 'dave'}, {name: 'mike'}])
|
|
82
82
|
assert_equal 2, @user.all.rows
|
|
83
83
|
|
|
84
84
|
Swift.db.delete @user, ':name = ?', 'dave'
|
data/test/test_types.rb
CHANGED
|
@@ -26,7 +26,7 @@ describe 'Adapter' do
|
|
|
26
26
|
|
|
27
27
|
it 'query result is typecast correctly' do
|
|
28
28
|
dt = '2010-01-01 23:22:21'
|
|
29
|
-
bind = [ 1, 'jim', 32, 178.71, true, false, '2010-01-02', "#{dt}.
|
|
29
|
+
bind = [ 1, 'jim', 32, 178.71, true, false, '2010-01-02', "#{dt}.065+11:00" ]
|
|
30
30
|
@db.execute %q{insert into users values(?, ?, ?, ?, ?, ?, ?, ?)}, *bind
|
|
31
31
|
|
|
32
32
|
result = @db.prepare(%q{select * from users limit 1}).execute.first
|
|
@@ -40,7 +40,7 @@ describe 'Adapter' do
|
|
|
40
40
|
assert_kind_of Time, result[:updated]
|
|
41
41
|
|
|
42
42
|
assert_equal dt, result[:updated].strftime('%F %T')
|
|
43
|
-
assert_equal
|
|
43
|
+
assert_equal 65000, result[:updated].usec unless @db.kind_of?(Swift::DB::Mysql)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
metadata
CHANGED
|
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
|
4
4
|
prerelease: false
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
version: 0.
|
|
7
|
+
- 9
|
|
8
|
+
- 0
|
|
9
|
+
version: 0.9.0
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Shane Hanna
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-
|
|
18
|
+
date: 2011-02-10 00:00:00 +11:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|