ohm 1.0.0.rc1 → 1.0.0.rc2
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/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.
|