ohm 0.0.38 → 0.1.0.rc1
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.markdown +25 -0
- data/Rakefile +2 -10
- data/lib/ohm.rb +33 -40
- data/lib/ohm/collection.rb +2 -2
- data/lib/ohm/key.rb +13 -35
- data/lib/ohm/utils/upgrade.rb +53 -0
- data/test/indices_test.rb +1 -1
- data/test/model_module_test.rb +951 -0
- data/test/model_test.rb +41 -15
- data/test/test.conf +1 -1
- data/test/test_helper.rb +3 -3
- data/test/upgrade_script_test.rb +68 -0
- metadata +19 -11
- data/test/benchmarks.rb +0 -39
- data/test/circular_reference_test.rb +0 -28
- data/test/wrapper_test.rb +0 -20
data/test/model_test.rb
CHANGED
@@ -40,7 +40,7 @@ class Event < Ohm::Model
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
class
|
43
|
+
class ModelTest < Test::Unit::TestCase
|
44
44
|
setup do
|
45
45
|
Ohm.flush
|
46
46
|
end
|
@@ -167,7 +167,7 @@ class TestRedis < Test::Unit::TestCase
|
|
167
167
|
context "Finding an event" do
|
168
168
|
setup do
|
169
169
|
Ohm.redis.sadd("Event:all", 1)
|
170
|
-
Ohm.redis.
|
170
|
+
Ohm.redis.hset("Event:1", "name", "Concert")
|
171
171
|
end
|
172
172
|
|
173
173
|
should "return an instance of Event" do
|
@@ -180,7 +180,7 @@ class TestRedis < Test::Unit::TestCase
|
|
180
180
|
context "Finding a user" do
|
181
181
|
setup do
|
182
182
|
Ohm.redis.sadd("User:all", 1)
|
183
|
-
Ohm.redis.
|
183
|
+
Ohm.redis.hset("User:1", "email", "albert@example.com")
|
184
184
|
end
|
185
185
|
|
186
186
|
should "return an instance of User" do
|
@@ -277,8 +277,8 @@ class TestRedis < Test::Unit::TestCase
|
|
277
277
|
|
278
278
|
assert_nil Ohm.redis.get(ModelToBeDeleted.key(id))
|
279
279
|
assert_nil Ohm.redis.get(ModelToBeDeleted.key(id, :name))
|
280
|
-
|
281
|
-
|
280
|
+
assert_equal Array.new, Ohm.redis.smembers(ModelToBeDeleted.key(id, :foos))
|
281
|
+
assert_equal Array.new, Ohm.redis.lrange(ModelToBeDeleted.key(id, :bars), 0, -1)
|
282
282
|
|
283
283
|
assert ModelToBeDeleted.all.empty?
|
284
284
|
end
|
@@ -293,16 +293,11 @@ class TestRedis < Test::Unit::TestCase
|
|
293
293
|
|
294
294
|
Foo.create(:name => "Bar")
|
295
295
|
|
296
|
-
assert_equal ["Foo:1:_indices", "Foo:1
|
296
|
+
assert_equal ["Foo:1:_indices", "Foo:1", "Foo:all", "Foo:id", "Foo:name:QmFy"].sort, Ohm.redis.keys("*").sort
|
297
297
|
|
298
298
|
Foo[1].delete
|
299
299
|
|
300
|
-
|
301
|
-
|
302
|
-
assert !keys.include?("Foo:1:_indices")
|
303
|
-
assert !keys.include?("Foo:1:name")
|
304
|
-
|
305
|
-
assert_equal "1", Ohm.redis.get("Foo:id")
|
300
|
+
assert_equal ["Foo:id"], Ohm.redis.keys("*")
|
306
301
|
end
|
307
302
|
end
|
308
303
|
|
@@ -602,6 +597,7 @@ class TestRedis < Test::Unit::TestCase
|
|
602
597
|
|
603
598
|
class ::Appointment < Ohm::Model
|
604
599
|
attribute :text
|
600
|
+
reference :subscriber, lambda { |id| MyActiveRecordModel.find(id) }
|
605
601
|
end
|
606
602
|
|
607
603
|
setup do
|
@@ -620,6 +616,11 @@ class TestRedis < Test::Unit::TestCase
|
|
620
616
|
assert_equal [MyActiveRecordModel.find(1)], @calendar.subscribers.all
|
621
617
|
end
|
622
618
|
|
619
|
+
should "allow lambdas in references" do
|
620
|
+
appointment = Appointment.create(:subscriber => MyActiveRecordModel.find(1))
|
621
|
+
assert_equal MyActiveRecordModel.find(1), appointment.subscriber
|
622
|
+
end
|
623
|
+
|
623
624
|
should "work with models too" do
|
624
625
|
@calendar.appointments.add(Appointment.create(:text => "Meet with Bertrand"))
|
625
626
|
|
@@ -697,11 +698,17 @@ class TestRedis < Test::Unit::TestCase
|
|
697
698
|
should "be able to increment a counter" do
|
698
699
|
@event.incr(:votes)
|
699
700
|
assert_equal 1, @event.votes
|
701
|
+
|
702
|
+
@event.incr(:votes, 2)
|
703
|
+
assert_equal 3, @event.votes
|
700
704
|
end
|
701
705
|
|
702
706
|
should "be able to decrement a counter" do
|
703
707
|
@event.decr(:votes)
|
704
708
|
assert_equal -1, @event.votes
|
709
|
+
|
710
|
+
@event.decr(:votes, 2)
|
711
|
+
assert_equal -3, @event.votes
|
705
712
|
end
|
706
713
|
end
|
707
714
|
|
@@ -910,7 +917,7 @@ class TestRedis < Test::Unit::TestCase
|
|
910
917
|
end
|
911
918
|
|
912
919
|
setup do
|
913
|
-
Car.connect(:port =>
|
920
|
+
Car.connect(:port => 6379, :db => 14)
|
914
921
|
end
|
915
922
|
|
916
923
|
teardown do
|
@@ -921,8 +928,11 @@ class TestRedis < Test::Unit::TestCase
|
|
921
928
|
car = Car.create(:name => "Twingo")
|
922
929
|
make = Make.create(:name => "Renault")
|
923
930
|
|
924
|
-
assert_equal 1,
|
925
|
-
assert_equal
|
931
|
+
assert_equal ["1"], Redis.new(:db => 15).smembers("Make:all")
|
932
|
+
assert_equal [], Redis.new(:db => 15).smembers("Car:all")
|
933
|
+
|
934
|
+
assert_equal ["1"], Redis.new(:db => 14).smembers("Car:all")
|
935
|
+
assert_equal [], Redis.new(:db => 14).smembers("Make:all")
|
926
936
|
|
927
937
|
assert_equal car, Car[1]
|
928
938
|
assert_equal make, Make[1]
|
@@ -933,4 +943,20 @@ class TestRedis < Test::Unit::TestCase
|
|
933
943
|
assert_nil Make[1]
|
934
944
|
end
|
935
945
|
end
|
946
|
+
|
947
|
+
context "Persistence" do
|
948
|
+
should "persist attributes to a hash" do
|
949
|
+
event = Event.create(:name => "Redis Meetup")
|
950
|
+
event.incr(:votes)
|
951
|
+
|
952
|
+
assert_equal "hash", Ohm.redis.type("Event:1")
|
953
|
+
|
954
|
+
assert_equal [
|
955
|
+
"Event:1", "Event:all", "Event:id"
|
956
|
+
].sort, Ohm.redis.keys("Event:*").sort
|
957
|
+
|
958
|
+
assert_equal "Redis Meetup", Event[1].name
|
959
|
+
assert_equal 1, Event[1].votes
|
960
|
+
end
|
961
|
+
end
|
936
962
|
end
|
data/test/test.conf
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
2
2
|
|
3
3
|
begin
|
4
4
|
require "ruby-debug"
|
@@ -6,7 +6,7 @@ rescue LoadError
|
|
6
6
|
end
|
7
7
|
|
8
8
|
require "contest"
|
9
|
-
require
|
9
|
+
require "ohm"
|
10
10
|
|
11
|
-
Ohm.connect(:port =>
|
11
|
+
Ohm.connect(:port => 6379, :db => 15, :timeout => 3)
|
12
12
|
Ohm.flush
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
4
|
+
|
5
|
+
require "ohm/utils/upgrade"
|
6
|
+
|
7
|
+
# class User < Ohm::Model
|
8
|
+
# attribute :name
|
9
|
+
# attribute :email
|
10
|
+
#
|
11
|
+
# counter :views
|
12
|
+
#
|
13
|
+
# index :email
|
14
|
+
#
|
15
|
+
# set :posts
|
16
|
+
# list :comments
|
17
|
+
# end
|
18
|
+
|
19
|
+
class UpgradeScriptTest < Test::Unit::TestCase
|
20
|
+
def redis
|
21
|
+
Ohm.redis
|
22
|
+
end
|
23
|
+
|
24
|
+
setup do
|
25
|
+
redis.flushdb
|
26
|
+
|
27
|
+
@users = Ohm::Key[:User]
|
28
|
+
|
29
|
+
10.times do
|
30
|
+
@id = redis.incr(@users[:id])
|
31
|
+
@user = @users[@id]
|
32
|
+
|
33
|
+
redis.sadd @users[:all], @id
|
34
|
+
|
35
|
+
redis.set @user[:name], "Albert"
|
36
|
+
redis.set @user[:email], "albert-#{@id}@example.com"
|
37
|
+
redis.incr @user[:views]
|
38
|
+
|
39
|
+
redis.sadd @user[:posts], 1
|
40
|
+
redis.sadd @user[:posts], 2
|
41
|
+
|
42
|
+
redis.lpush @user[:comments], 3
|
43
|
+
redis.lpush @user[:comments], 4
|
44
|
+
|
45
|
+
redis.sadd @user[:_indices], @users[:email][Ohm::Model.encode "albert-#{@id}@example.com"]
|
46
|
+
redis.sadd @users[:email][Ohm::Model.encode "albert-#{@id}@example.com"], @id
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
should "upgrade to hashes" do
|
51
|
+
Ohm::Utils::Upgrade.new([:User]).run
|
52
|
+
|
53
|
+
@user = @users[1]
|
54
|
+
|
55
|
+
assert_nil redis.get(@user[:name])
|
56
|
+
assert_nil redis.get(@user[:email])
|
57
|
+
assert_nil redis.get(@user[:views])
|
58
|
+
|
59
|
+
assert_equal ["1", "2"], redis.smembers(@user[:posts])
|
60
|
+
|
61
|
+
assert_equal [@users[:email][Ohm::Model.encode "albert-1@example.com"]], redis.smembers(@user[:_indices])
|
62
|
+
assert_equal ["1"], redis.smembers(@users[:email][Ohm::Model.encode "albert-1@example.com"])
|
63
|
+
|
64
|
+
assert_equal "Albert", redis.hget(@user, :name)
|
65
|
+
assert_equal "albert-1@example.com", redis.hget(@user, :email)
|
66
|
+
assert_equal "1", redis.hget(@user, :views)
|
67
|
+
end
|
68
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 176182720
|
5
|
+
prerelease: true
|
5
6
|
segments:
|
6
7
|
- 0
|
8
|
+
- 1
|
7
9
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
10
|
+
- rc1
|
11
|
+
version: 0.1.0.rc1
|
10
12
|
platform: ruby
|
11
13
|
authors:
|
12
14
|
- Michel Martens
|
@@ -15,7 +17,7 @@ autorequire:
|
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
19
|
|
18
|
-
date: 2010-
|
20
|
+
date: 2010-05-10 00:00:00 -03:00
|
19
21
|
default_executable:
|
20
22
|
dependencies:
|
21
23
|
- !ruby/object:Gem::Dependency
|
@@ -26,6 +28,7 @@ dependencies:
|
|
26
28
|
requirements:
|
27
29
|
- - ">="
|
28
30
|
- !ruby/object:Gem::Version
|
31
|
+
hash: 31
|
29
32
|
segments:
|
30
33
|
- 1
|
31
34
|
- 0
|
@@ -41,6 +44,7 @@ dependencies:
|
|
41
44
|
requirements:
|
42
45
|
- - ~>
|
43
46
|
- !ruby/object:Gem::Version
|
47
|
+
hash: 9
|
44
48
|
segments:
|
45
49
|
- 0
|
46
50
|
- 1
|
@@ -61,6 +65,7 @@ files:
|
|
61
65
|
- lib/ohm/collection.rb
|
62
66
|
- lib/ohm/compat-1.8.6.rb
|
63
67
|
- lib/ohm/key.rb
|
68
|
+
- lib/ohm/utils/upgrade.rb
|
64
69
|
- lib/ohm/validations.rb
|
65
70
|
- lib/ohm.rb
|
66
71
|
- README.markdown
|
@@ -68,16 +73,15 @@ files:
|
|
68
73
|
- Rakefile
|
69
74
|
- test/1.8.6_test.rb
|
70
75
|
- test/all_tests.rb
|
71
|
-
- test/benchmarks.rb
|
72
|
-
- test/circular_reference_test.rb
|
73
76
|
- test/connection_test.rb
|
74
77
|
- test/errors_test.rb
|
75
78
|
- test/indices_test.rb
|
79
|
+
- test/model_module_test.rb
|
76
80
|
- test/model_test.rb
|
77
81
|
- test/mutex_test.rb
|
78
82
|
- test/test_helper.rb
|
83
|
+
- test/upgrade_script_test.rb
|
79
84
|
- test/validations_test.rb
|
80
|
-
- test/wrapper_test.rb
|
81
85
|
- test/test.conf
|
82
86
|
has_rdoc: true
|
83
87
|
homepage: http://github.com/soveran/ohm
|
@@ -93,21 +97,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
97
|
requirements:
|
94
98
|
- - ">="
|
95
99
|
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
96
101
|
segments:
|
97
102
|
- 0
|
98
103
|
version: "0"
|
99
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
105
|
none: false
|
101
106
|
requirements:
|
102
|
-
- - "
|
107
|
+
- - ">"
|
103
108
|
- !ruby/object:Gem::Version
|
109
|
+
hash: 25
|
104
110
|
segments:
|
105
|
-
-
|
106
|
-
|
111
|
+
- 1
|
112
|
+
- 3
|
113
|
+
- 1
|
114
|
+
version: 1.3.1
|
107
115
|
requirements: []
|
108
116
|
|
109
117
|
rubyforge_project: ohm
|
110
|
-
rubygems_version: 1.3.7
|
118
|
+
rubygems_version: 1.3.7.pre.1
|
111
119
|
signing_key:
|
112
120
|
specification_version: 3
|
113
121
|
summary: Object-hash mapping library for Redis.
|
data/test/benchmarks.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "bench"
|
3
|
-
require File.dirname(__FILE__) + "/../lib/ohm"
|
4
|
-
|
5
|
-
Ohm.connect(:port => 6381)
|
6
|
-
Ohm.flush
|
7
|
-
|
8
|
-
class Event < Ohm::Model
|
9
|
-
attribute :name
|
10
|
-
attribute :location
|
11
|
-
|
12
|
-
index :name
|
13
|
-
index :location
|
14
|
-
|
15
|
-
def validate
|
16
|
-
assert_present :name
|
17
|
-
assert_present :location
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
i = 0
|
22
|
-
|
23
|
-
benchmark "Create Events" do
|
24
|
-
Event.create(:name => "Redis Meetup #{i}", :location => "London #{i}")
|
25
|
-
end
|
26
|
-
|
27
|
-
benchmark "Find by indexed attribute" do
|
28
|
-
Event.find(:name => "Redis Meetup #{i}").first
|
29
|
-
end
|
30
|
-
|
31
|
-
benchmark "Mass update" do
|
32
|
-
Event[1].update(:name => "Redis Meetup II")
|
33
|
-
end
|
34
|
-
|
35
|
-
benchmark "Load events" do
|
36
|
-
Event[1].name
|
37
|
-
end
|
38
|
-
|
39
|
-
run 5000
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path("test_helper", File.dirname(__FILE__))
|
2
|
-
|
3
|
-
class Post < Ohm::Model
|
4
|
-
attribute :title
|
5
|
-
|
6
|
-
list :categories, Category
|
7
|
-
end
|
8
|
-
|
9
|
-
class Category < Ohm::Model
|
10
|
-
attribute :name
|
11
|
-
|
12
|
-
set :posts, Post
|
13
|
-
end
|
14
|
-
|
15
|
-
class CircularReferenceTest < Test::Unit::TestCase
|
16
|
-
setup do
|
17
|
-
@post = Post.create(:title => "New post")
|
18
|
-
@category = Category.create(:name => "Ruby")
|
19
|
-
end
|
20
|
-
|
21
|
-
test "inspect" do
|
22
|
-
@post.categories << @category
|
23
|
-
@category.posts << @post
|
24
|
-
|
25
|
-
assert_equal %Q{#<Post:1 title="New post" categories=#<List (Category): ["1"]>>}, @post.inspect
|
26
|
-
assert_equal %Q{#<Category:1 name="Ruby" posts=#<Set (Post): ["1"]>>}, @category.inspect
|
27
|
-
end
|
28
|
-
end
|
data/test/wrapper_test.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
|
2
|
-
|
3
|
-
$missing_constants = []
|
4
|
-
|
5
|
-
class Object
|
6
|
-
def self.const_missing(name)
|
7
|
-
$missing_constants << name
|
8
|
-
super(name)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Foo < Ohm::Model
|
13
|
-
set :bars, Bar
|
14
|
-
end
|
15
|
-
|
16
|
-
class Tests < Test::Unit::TestCase
|
17
|
-
test "calls other const_missing hooks" do
|
18
|
-
assert_equal [:Bar], $missing_constants
|
19
|
-
end
|
20
|
-
end
|