ohm 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/ohm.rb +99 -81
- data/lib/ohm/transaction.rb +21 -17
- data/test/association.rb +1 -1
- data/test/connection.rb +1 -1
- data/test/counters.rb +1 -1
- data/test/extensibility.rb +1 -1
- data/test/filtering.rb +19 -19
- data/test/helper.rb +1 -0
- data/test/indices.rb +5 -5
- data/test/json.rb +9 -9
- data/test/lua-save.rb +34 -34
- data/test/lua.rb +5 -5
- data/test/model.rb +16 -16
- data/test/pipeline-performance.rb +13 -11
- data/test/transactions.rb +32 -45
- data/test/uniques.rb +9 -9
- data/test/validations.rb +4 -4
- metadata +10 -10
data/test/model.rb
CHANGED
@@ -61,7 +61,7 @@ test "customized ID" do
|
|
61
61
|
inv = Invoice.create
|
62
62
|
assert_equal "_custom_id", inv.id
|
63
63
|
|
64
|
-
i = Invoice.create(id
|
64
|
+
i = Invoice.create(:id => "_diff_id")
|
65
65
|
assert_equal "_diff_id", i.id
|
66
66
|
assert_equal i, Invoice["_diff_id"]
|
67
67
|
end
|
@@ -74,7 +74,7 @@ test "empty model is ok" do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
test "counters are cleaned up during deletion" do
|
77
|
-
e = Event.create(name
|
77
|
+
e = Event.create(:name => "Foo")
|
78
78
|
e.incr :votes, 10
|
79
79
|
|
80
80
|
assert_equal 10, e.votes
|
@@ -93,7 +93,7 @@ test "return false if the validation fails" do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
test "get" do
|
96
|
-
m = Meetup.create(name
|
96
|
+
m = Meetup.create(:name => "Foo")
|
97
97
|
m.name = "Bar"
|
98
98
|
|
99
99
|
assert_equal "Foo", m.get(:name)
|
@@ -101,7 +101,7 @@ test "get" do
|
|
101
101
|
end
|
102
102
|
|
103
103
|
test "set" do
|
104
|
-
m = Meetup.create(name
|
104
|
+
m = Meetup.create(:name => "Foo")
|
105
105
|
|
106
106
|
m.set :name, "Bar"
|
107
107
|
assert_equal "Bar", m.name
|
@@ -411,7 +411,7 @@ test "work on lists" do
|
|
411
411
|
post.related.key.rpush(Post.create(:body => "B").id)
|
412
412
|
post.related.key.rpush(Post.create(:body => "A").id)
|
413
413
|
|
414
|
-
res = post.related.sort_by(:body, order
|
414
|
+
res = post.related.sort_by(:body, :order => "ALPHA ASC").map { |r| r.body }
|
415
415
|
assert_equal ["A", "B", "C"], res
|
416
416
|
end
|
417
417
|
|
@@ -439,19 +439,19 @@ class Entry < Ohm::Model
|
|
439
439
|
end
|
440
440
|
|
441
441
|
setup do
|
442
|
-
Entry.create(tags
|
442
|
+
Entry.create(:tags => "foo bar baz")
|
443
443
|
end
|
444
444
|
|
445
445
|
test "finding by one entry in the enumerable" do |entry|
|
446
|
-
assert Entry.find(tag
|
447
|
-
assert Entry.find(tag
|
448
|
-
assert Entry.find(tag
|
446
|
+
assert Entry.find(:tag => "foo").include?(entry)
|
447
|
+
assert Entry.find(:tag => "bar").include?(entry)
|
448
|
+
assert Entry.find(:tag => "baz").include?(entry)
|
449
449
|
end
|
450
450
|
|
451
451
|
test "finding by multiple entries in the enumerable" do |entry|
|
452
|
-
assert Entry.find(tag
|
453
|
-
assert Entry.find(tag
|
454
|
-
assert Entry.find(tag
|
452
|
+
assert Entry.find(:tag => ["foo", "bar"]).include?(entry)
|
453
|
+
assert Entry.find(:tag => ["bar", "baz"]).include?(entry)
|
454
|
+
assert Entry.find(:tag => ["baz", "oof"]).empty?
|
455
455
|
end
|
456
456
|
|
457
457
|
# Attributes of type Set
|
@@ -562,12 +562,12 @@ test "sort the model instances by the values provided" do
|
|
562
562
|
end
|
563
563
|
|
564
564
|
test "accept a number in the limit parameter" do
|
565
|
-
people = @event.attendees.sort_by(:name, limit
|
565
|
+
people = @event.attendees.sort_by(:name, :limit => [0, 2], :order => "ALPHA")
|
566
566
|
assert %w[A B] == people.map { |person| person.name }
|
567
567
|
end
|
568
568
|
|
569
569
|
test "use the start parameter as an offset if the limit is provided" do
|
570
|
-
people = @event.attendees.sort_by(:name, limit
|
570
|
+
people = @event.attendees.sort_by(:name, :limit => [1, 2], :order => "ALPHA")
|
571
571
|
assert %w[B C] == people.map { |person| person.name }
|
572
572
|
end
|
573
573
|
|
@@ -742,7 +742,7 @@ test "typecast attributes" do
|
|
742
742
|
end
|
743
743
|
|
744
744
|
option = Option.create :votes => 20
|
745
|
-
option.update(votes
|
745
|
+
option.update(:votes => option.votes + 1)
|
746
746
|
|
747
747
|
assert_equal 21, option.votes
|
748
748
|
end
|
@@ -758,7 +758,7 @@ test "poster-example for overriding writers" do
|
|
758
758
|
end
|
759
759
|
end
|
760
760
|
|
761
|
-
a = Advertiser.new(email
|
761
|
+
a = Advertiser.new(:email => " FOO@BAR.COM ")
|
762
762
|
assert_equal "foo@bar.com", a.email
|
763
763
|
end
|
764
764
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require File.expand_path("./helper", File.dirname(__FILE__))
|
2
4
|
|
3
5
|
Ohm.flush
|
4
6
|
|
@@ -14,14 +16,14 @@ class User < Ohm::Model
|
|
14
16
|
end
|
15
17
|
|
16
18
|
create = lambda do |i|
|
17
|
-
User.new(fname
|
18
|
-
lname
|
19
|
-
bday
|
20
|
-
gender
|
21
|
-
city
|
22
|
-
state
|
23
|
-
country
|
24
|
-
zip
|
19
|
+
User.new(:fname => "John#{i}",
|
20
|
+
:lname => "Doe#{i}",
|
21
|
+
:bday => Time.now.to_s,
|
22
|
+
:gender => "Male",
|
23
|
+
:city => "Los Angeles",
|
24
|
+
:state => "CA",
|
25
|
+
:country => "US",
|
26
|
+
:zip => "90210").save
|
25
27
|
end
|
26
28
|
|
27
29
|
10.times(&create)
|
@@ -29,7 +31,7 @@ end
|
|
29
31
|
require "benchmark"
|
30
32
|
|
31
33
|
t1 = Benchmark.realtime do
|
32
|
-
User.all.sort_by(:fname, order
|
34
|
+
User.all.sort_by(:fname, :order => "DESC ALPHA").each do |user|
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
@@ -48,7 +50,7 @@ end
|
|
48
50
|
90.times(&create)
|
49
51
|
|
50
52
|
t1 = Benchmark.realtime do
|
51
|
-
User.all.sort_by(:fname, order
|
53
|
+
User.all.sort_by(:fname, :order => "DESC ALPHA").each do |user|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
data/test/transactions.rb
CHANGED
@@ -45,11 +45,11 @@ end
|
|
45
45
|
test "transaction local storage" do |db|
|
46
46
|
t1 = Ohm::Transaction.new do |t|
|
47
47
|
t.read do |s|
|
48
|
-
s
|
48
|
+
s[:foo] = db.type("foo")
|
49
49
|
end
|
50
50
|
|
51
51
|
t.write do |s|
|
52
|
-
db.set("foo", s
|
52
|
+
db.set("foo", s[:foo].reverse)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -62,7 +62,7 @@ test "composed transaction" do |db|
|
|
62
62
|
t1 = Ohm::Transaction.new do |t|
|
63
63
|
t.watch("foo")
|
64
64
|
|
65
|
-
t.write do
|
65
|
+
t.write do
|
66
66
|
db.set("foo", "bar")
|
67
67
|
end
|
68
68
|
end
|
@@ -70,7 +70,7 @@ test "composed transaction" do |db|
|
|
70
70
|
t2 = Ohm::Transaction.new do |t|
|
71
71
|
t.watch("foo")
|
72
72
|
|
73
|
-
t.write do
|
73
|
+
t.write do
|
74
74
|
db.set("foo", "baz")
|
75
75
|
end
|
76
76
|
end
|
@@ -158,13 +158,13 @@ end
|
|
158
158
|
test "storage in composed transactions" do |db|
|
159
159
|
t1 = Ohm::Transaction.new do |t|
|
160
160
|
t.read do |s|
|
161
|
-
s
|
161
|
+
s[:foo] = db.type("foo")
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
165
165
|
t2 = Ohm::Transaction.new do |t|
|
166
166
|
t.write do |s|
|
167
|
-
db.set("foo", s
|
167
|
+
db.set("foo", s[:foo].reverse)
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
@@ -176,11 +176,11 @@ end
|
|
176
176
|
test "reading an storage entries that doesn't exist raises" do |db|
|
177
177
|
t1 = Ohm::Transaction.new do |t|
|
178
178
|
t.read do |s|
|
179
|
-
s
|
179
|
+
s[:foo]
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
-
assert_raise
|
183
|
+
assert_raise Ohm::Transaction::Store::NoEntryError do
|
184
184
|
t1.commit(db)
|
185
185
|
end
|
186
186
|
end
|
@@ -188,13 +188,13 @@ end
|
|
188
188
|
test "storage entries can't be overriden" do |db|
|
189
189
|
t1 = Ohm::Transaction.new do |t|
|
190
190
|
t.read do |s|
|
191
|
-
s
|
191
|
+
s[:foo] = db.type("foo")
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
195
195
|
t2 = Ohm::Transaction.new do |t|
|
196
196
|
t.read do |s|
|
197
|
-
s
|
197
|
+
s[:foo] = db.exists("foo")
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
@@ -203,51 +203,38 @@ test "storage entries can't be overriden" do |db|
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
class Post < Ohm::Model
|
211
|
-
attribute :body
|
212
|
-
attribute :state
|
213
|
-
index :state
|
214
|
-
|
215
|
-
def before_save
|
216
|
-
self.body = body.to_s.strip
|
206
|
+
test "banking transaction" do |db|
|
207
|
+
class A < Ohm::Model
|
208
|
+
attribute :amount
|
217
209
|
end
|
218
210
|
|
219
|
-
|
220
|
-
|
211
|
+
class B < Ohm::Model
|
212
|
+
attribute :amount
|
221
213
|
end
|
222
|
-
end
|
223
|
-
|
224
|
-
test "transactions in models" do |db|
|
225
|
-
p = Post.new(body: " foo ")
|
226
214
|
|
227
|
-
|
215
|
+
def transfer(amount, account1, account2)
|
216
|
+
Ohm.transaction do |t|
|
228
217
|
|
229
|
-
|
230
|
-
t.watch("csv:foo")
|
218
|
+
t.watch(account1.key, account2.key)
|
231
219
|
|
232
|
-
|
233
|
-
|
234
|
-
|
220
|
+
t.read do |s|
|
221
|
+
s[:available] = account1.get(:amount).to_i
|
222
|
+
end
|
235
223
|
|
236
|
-
|
237
|
-
|
224
|
+
t.write do |s|
|
225
|
+
if s[:available] >= amount
|
226
|
+
account1.key.hincrby(:amount, - amount)
|
227
|
+
account2.key.hincrby(:amount, amount)
|
228
|
+
end
|
229
|
+
end
|
238
230
|
end
|
239
231
|
end
|
240
232
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
# Verify the Post transaction proceeded without a hitch
|
245
|
-
p = Post[p.id]
|
233
|
+
a = A.create :amount => 100
|
234
|
+
b = B.create :amount => 0
|
246
235
|
|
247
|
-
|
248
|
-
assert_equal "foo", p.body
|
249
|
-
assert Post.find(state: "draft").include?(p)
|
236
|
+
transfer(100, a, b).commit(db)
|
250
237
|
|
251
|
-
|
252
|
-
assert_equal
|
238
|
+
assert_equal a.get(:amount), "0"
|
239
|
+
assert_equal b.get(:amount), "100"
|
253
240
|
end
|
data/test/uniques.rb
CHANGED
@@ -17,7 +17,7 @@ class User < Ohm::Model
|
|
17
17
|
end
|
18
18
|
|
19
19
|
setup do
|
20
|
-
User.create(email
|
20
|
+
User.create(:email => "a@a.com")
|
21
21
|
end
|
22
22
|
|
23
23
|
test "findability" do |u|
|
@@ -26,12 +26,12 @@ end
|
|
26
26
|
|
27
27
|
test "raises when it already exists during create" do
|
28
28
|
assert_raise Ohm::UniqueIndexViolation do
|
29
|
-
User.create(email
|
29
|
+
User.create(:email => "a@a.com")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
test "raises when it already exists during save" do
|
34
|
-
u = User.create(email
|
34
|
+
u = User.create(:email => "b@b.com")
|
35
35
|
u.email = "a@a.com"
|
36
36
|
|
37
37
|
assert_raise Ohm::UniqueIndexViolation do
|
@@ -52,8 +52,8 @@ test "doesn't raise when saving again and again" do |u|
|
|
52
52
|
end
|
53
53
|
|
54
54
|
test "removes the previous index when changing" do
|
55
|
-
u = User.create(email
|
56
|
-
u.update(email
|
55
|
+
u = User.create(:email => "c@c.com")
|
56
|
+
u.update(:email => "d@d.com")
|
57
57
|
|
58
58
|
assert_equal nil, User.with(:email, "c@c.com")
|
59
59
|
assert_equal nil, User.key[:unique][:email].hget("c@c.com")
|
@@ -68,20 +68,20 @@ test "removes the previous index when deleting" do |u|
|
|
68
68
|
end
|
69
69
|
|
70
70
|
test "unique virtual attribute" do
|
71
|
-
u = User.create(email
|
71
|
+
u = User.create(:email => "foo@yahoo.com")
|
72
72
|
|
73
73
|
assert_equal u, User.with(:provider, "yahoo")
|
74
74
|
|
75
75
|
# Yahoo should be allowed because this user is the one reserved for it.
|
76
|
-
u.update(email
|
76
|
+
u.update(:email => "bar@yahoo.com")
|
77
77
|
|
78
78
|
# `a` is not allowed though.
|
79
79
|
assert_raise Ohm::UniqueIndexViolation do
|
80
|
-
u.update(email
|
80
|
+
u.update(:email => "bar@a.com")
|
81
81
|
end
|
82
82
|
|
83
83
|
# And so is yahoo if we try creating a different user.
|
84
84
|
assert_raise Ohm::UniqueIndexViolation do
|
85
|
-
User.create(email
|
85
|
+
User.create(:email => "baz@yahoo.com")
|
86
86
|
end
|
87
87
|
end
|
data/test/validations.rb
CHANGED
@@ -68,7 +68,7 @@ scope do
|
|
68
68
|
event.save
|
69
69
|
|
70
70
|
assert event.new?
|
71
|
-
assert_equal({capacity
|
71
|
+
assert_equal({:capacity => [:not_numeric]}, event.errors)
|
72
72
|
end
|
73
73
|
|
74
74
|
test "fail when the value is not numeric" do |event|
|
@@ -82,7 +82,7 @@ scope do
|
|
82
82
|
event.save
|
83
83
|
|
84
84
|
assert event.new?
|
85
|
-
assert_equal({capacity
|
85
|
+
assert_equal({:capacity => [:not_numeric]}, event.errors)
|
86
86
|
end
|
87
87
|
|
88
88
|
test "succeed when the value is numeric" do |event|
|
@@ -182,14 +182,14 @@ scope do
|
|
182
182
|
test "fail when the attribute is nil" do |target|
|
183
183
|
target.validate
|
184
184
|
|
185
|
-
assert_equal({ name
|
185
|
+
assert_equal({ :name => [:not_present] }, target.errors)
|
186
186
|
end
|
187
187
|
|
188
188
|
test "fail when the attribute is empty" do |target|
|
189
189
|
target.name = ""
|
190
190
|
target.validate
|
191
191
|
|
192
|
-
assert_equal({ name
|
192
|
+
assert_equal({ :name => [:not_present] }, target.errors)
|
193
193
|
end
|
194
194
|
end
|
195
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-04-
|
13
|
+
date: 2012-04-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nest
|
17
|
-
requirement: &
|
17
|
+
requirement: &2151942880 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '1.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2151942880
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: scrivener
|
28
|
-
requirement: &
|
28
|
+
requirement: &2151941460 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.0.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2151941460
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: cutest
|
39
|
-
requirement: &
|
39
|
+
requirement: &2151940600 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0.1'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2151940600
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: batch
|
50
|
-
requirement: &
|
50
|
+
requirement: &2151936780 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ~>
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: 0.0.1
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2151936780
|
59
59
|
description: Ohm is a library that allows to store an object in Redis, a persistent
|
60
60
|
key-value database. It includes an extensible list of validations and has very good
|
61
61
|
performance.
|