sohm 0.0.1
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.
- checksums.yaml +7 -0
- data/.gems +4 -0
- data/.gitignore +3 -0
- data/CHANGELOG.md +312 -0
- data/LICENSE +19 -0
- data/README.md +10 -0
- data/benchmarks/common.rb +33 -0
- data/benchmarks/create.rb +21 -0
- data/benchmarks/delete.rb +13 -0
- data/examples/activity-feed.rb +162 -0
- data/examples/chaining.rb +162 -0
- data/examples/json-hash.rb +75 -0
- data/examples/one-to-many.rb +124 -0
- data/examples/philosophy.rb +137 -0
- data/examples/redis-logging.txt +179 -0
- data/examples/slug.rb +149 -0
- data/examples/tagging.rb +237 -0
- data/lib/sample.rb +14 -0
- data/lib/sohm/command.rb +51 -0
- data/lib/sohm/json.rb +17 -0
- data/lib/sohm/lua/delete.lua +72 -0
- data/lib/sohm/lua/save.lua +13 -0
- data/lib/sohm.rb +1576 -0
- data/makefile +4 -0
- data/sohm.gemspec +18 -0
- data/test/association.rb +33 -0
- data/test/command.rb +55 -0
- data/test/connection.rb +16 -0
- data/test/core.rb +24 -0
- data/test/counters.rb +67 -0
- data/test/enumerable.rb +79 -0
- data/test/filtering.rb +185 -0
- data/test/hash_key.rb +31 -0
- data/test/helper.rb +23 -0
- data/test/indices.rb +133 -0
- data/test/json.rb +62 -0
- data/test/list.rb +83 -0
- data/test/model.rb +789 -0
- data/test/set.rb +37 -0
- data/test/thread_safety.rb +67 -0
- data/test/to_hash.rb +29 -0
- data/test/uniques.rb +98 -0
- metadata +142 -0
data/test/set.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Post < Ohm::Model
|
4
|
+
end
|
5
|
+
|
6
|
+
class User < Ohm::Model
|
7
|
+
attribute :name
|
8
|
+
|
9
|
+
index :name
|
10
|
+
|
11
|
+
set :posts, :Post
|
12
|
+
end
|
13
|
+
|
14
|
+
test '#exists? returns false if the given id is not included in the set' do
|
15
|
+
assert !User.create.posts.exists?('nonexistent')
|
16
|
+
end
|
17
|
+
|
18
|
+
test '#exists? returns true if the given id is included in the set' do
|
19
|
+
user = User.create
|
20
|
+
post = Post.create
|
21
|
+
user.posts.add(post)
|
22
|
+
|
23
|
+
assert user.posts.exists?(post.id)
|
24
|
+
end
|
25
|
+
|
26
|
+
test "#ids returns an array with the ids" do
|
27
|
+
user_ids = [
|
28
|
+
User.create(name: "John").id,
|
29
|
+
User.create(name: "Jane").id
|
30
|
+
]
|
31
|
+
|
32
|
+
assert_equal user_ids, User.all.ids
|
33
|
+
|
34
|
+
result = User.find(name: "John").union(name: "Jane")
|
35
|
+
|
36
|
+
assert_equal user_ids, result.ids
|
37
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
class Post < Ohm::Model; end
|
4
|
+
class Role < Ohm::Model; end
|
5
|
+
|
6
|
+
class User < Ohm::Model
|
7
|
+
list :posts, :Post
|
8
|
+
set :roles, :Role
|
9
|
+
end
|
10
|
+
|
11
|
+
setup do
|
12
|
+
User.create
|
13
|
+
end
|
14
|
+
|
15
|
+
test "list#replace" do |user|
|
16
|
+
Post.mutex.lock
|
17
|
+
|
18
|
+
thread = Thread.new { user.posts.replace([Post.create]) }
|
19
|
+
|
20
|
+
sleep 0.1
|
21
|
+
|
22
|
+
assert_equal true, thread.alive?
|
23
|
+
|
24
|
+
Post.mutex.unlock
|
25
|
+
|
26
|
+
sleep 0.1
|
27
|
+
|
28
|
+
assert_equal false, thread.alive?
|
29
|
+
|
30
|
+
thread.join
|
31
|
+
end
|
32
|
+
|
33
|
+
test "set#replace" do |user|
|
34
|
+
Role.mutex.lock
|
35
|
+
|
36
|
+
thread = Thread.new { user.roles.replace([Role.create]) }
|
37
|
+
|
38
|
+
sleep 0.1
|
39
|
+
|
40
|
+
assert_equal true, thread.alive?
|
41
|
+
|
42
|
+
Role.mutex.unlock
|
43
|
+
|
44
|
+
sleep 0.1
|
45
|
+
|
46
|
+
assert_equal false, thread.alive?
|
47
|
+
|
48
|
+
thread.join
|
49
|
+
end
|
50
|
+
|
51
|
+
test "collection#fetch" do
|
52
|
+
User.mutex.lock
|
53
|
+
|
54
|
+
thread = Thread.new { User.all.to_a }
|
55
|
+
|
56
|
+
sleep 0.1
|
57
|
+
|
58
|
+
assert_equal true, thread.alive?
|
59
|
+
|
60
|
+
User.mutex.unlock
|
61
|
+
|
62
|
+
sleep 0.1
|
63
|
+
|
64
|
+
assert_equal false, thread.alive?
|
65
|
+
|
66
|
+
thread.join
|
67
|
+
end
|
data/test/to_hash.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class User < Ohm::Model
|
4
|
+
end
|
5
|
+
|
6
|
+
test "returns an empty hash if model doesn't have set attributes" do
|
7
|
+
assert_equal Hash.new, User.new.to_hash
|
8
|
+
end
|
9
|
+
|
10
|
+
test "returns a hash with its id if model is persisted" do
|
11
|
+
user = User.create
|
12
|
+
|
13
|
+
assert_equal Hash[id: user.id], user.to_hash
|
14
|
+
end
|
15
|
+
|
16
|
+
class Person < Ohm::Model
|
17
|
+
attribute :name
|
18
|
+
|
19
|
+
def to_hash
|
20
|
+
super.merge(name: name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
test "returns additional attributes if the method is overrided" do
|
25
|
+
person = Person.create(name: "John")
|
26
|
+
expected = { id: person.id, name: person.name }
|
27
|
+
|
28
|
+
assert_equal expected, person.to_hash
|
29
|
+
end
|
data/test/uniques.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
class User < Ohm::Model
|
4
|
+
attribute :email
|
5
|
+
unique :email
|
6
|
+
unique :provider
|
7
|
+
|
8
|
+
def self.[](id)
|
9
|
+
super(id.to_i)
|
10
|
+
end
|
11
|
+
|
12
|
+
def provider
|
13
|
+
email.to_s[/@(.*?).com/, 1]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
setup do
|
18
|
+
User.create(:email => "a@a.com")
|
19
|
+
end
|
20
|
+
|
21
|
+
test "findability" do |u|
|
22
|
+
assert_equal u, User.with(:email, "a@a.com")
|
23
|
+
end
|
24
|
+
|
25
|
+
test "raises when it already exists during create" do
|
26
|
+
assert_raise Ohm::UniqueIndexViolation do
|
27
|
+
User.create(:email => "a@a.com")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
test "raises when it already exists during save" do
|
32
|
+
u = User.create(:email => "b@b.com")
|
33
|
+
u.email = "a@a.com"
|
34
|
+
|
35
|
+
assert_raise Ohm::UniqueIndexViolation do
|
36
|
+
u.save
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
test "raises if the index doesn't exist" do
|
41
|
+
User.create(:email => "b@b.com")
|
42
|
+
|
43
|
+
assert_raise Ohm::IndexNotFound do
|
44
|
+
User.with(:address, "b@b.com")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
test "doesn't raise when saving again and again" do |u|
|
49
|
+
ex = nil
|
50
|
+
|
51
|
+
begin
|
52
|
+
User[u.id].save
|
53
|
+
rescue Exception => e
|
54
|
+
ex = e
|
55
|
+
end
|
56
|
+
|
57
|
+
assert_equal nil, ex
|
58
|
+
end
|
59
|
+
|
60
|
+
test "removes the previous index when changing" do
|
61
|
+
u = User.create(:email => "c@c.com")
|
62
|
+
u.update(:email => "d@d.com")
|
63
|
+
|
64
|
+
assert_equal nil, User.with(:email, "c@c.com")
|
65
|
+
assert_equal nil, User.redis.call("HGET", User.key[:uniques][:email], "c@c.com")
|
66
|
+
assert_equal u, User.with(:email, "d@d.com")
|
67
|
+
|
68
|
+
u.update(:email => nil)
|
69
|
+
|
70
|
+
assert_equal nil, User.with(:email, "d@d.com")
|
71
|
+
assert_equal nil, User.redis.call("HGET", User.key[:uniques][:email], "d@d.com")
|
72
|
+
end
|
73
|
+
|
74
|
+
test "removes the previous index when deleting" do |u|
|
75
|
+
u.delete
|
76
|
+
|
77
|
+
assert_equal nil, User.with(:email, "a@a.com")
|
78
|
+
assert_equal nil, User.redis.call("HGET", User.key[:uniques][:email], "a@a.com")
|
79
|
+
end
|
80
|
+
|
81
|
+
test "unique virtual attribute" do
|
82
|
+
u = User.create(:email => "foo@yahoo.com")
|
83
|
+
|
84
|
+
assert_equal u, User.with(:provider, "yahoo")
|
85
|
+
|
86
|
+
# Yahoo should be allowed because this user is the one reserved for it.
|
87
|
+
u.update(:email => "bar@yahoo.com")
|
88
|
+
|
89
|
+
# `a` is not allowed though.
|
90
|
+
assert_raise Ohm::UniqueIndexViolation do
|
91
|
+
u.update(:email => "bar@a.com")
|
92
|
+
end
|
93
|
+
|
94
|
+
# And so is yahoo if we try creating a different user.
|
95
|
+
assert_raise Ohm::UniqueIndexViolation do
|
96
|
+
User.create(:email => "baz@yahoo.com")
|
97
|
+
end
|
98
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sohm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Xuejie Xiao
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redic
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nido
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.0.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.0.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: msgpack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.5.11
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.5.11
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: cutest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.2.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.2.2
|
69
|
+
description: Slim ohm is a forked ohm that works with twemproxy-like redis system,
|
70
|
+
only a limited set of features in ohm is supported
|
71
|
+
email:
|
72
|
+
- xxuejie@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gems"
|
78
|
+
- ".gitignore"
|
79
|
+
- CHANGELOG.md
|
80
|
+
- LICENSE
|
81
|
+
- README.md
|
82
|
+
- benchmarks/common.rb
|
83
|
+
- benchmarks/create.rb
|
84
|
+
- benchmarks/delete.rb
|
85
|
+
- examples/activity-feed.rb
|
86
|
+
- examples/chaining.rb
|
87
|
+
- examples/json-hash.rb
|
88
|
+
- examples/one-to-many.rb
|
89
|
+
- examples/philosophy.rb
|
90
|
+
- examples/redis-logging.txt
|
91
|
+
- examples/slug.rb
|
92
|
+
- examples/tagging.rb
|
93
|
+
- lib/sample.rb
|
94
|
+
- lib/sohm.rb
|
95
|
+
- lib/sohm/command.rb
|
96
|
+
- lib/sohm/json.rb
|
97
|
+
- lib/sohm/lua/delete.lua
|
98
|
+
- lib/sohm/lua/save.lua
|
99
|
+
- makefile
|
100
|
+
- sohm.gemspec
|
101
|
+
- test/association.rb
|
102
|
+
- test/command.rb
|
103
|
+
- test/connection.rb
|
104
|
+
- test/core.rb
|
105
|
+
- test/counters.rb
|
106
|
+
- test/enumerable.rb
|
107
|
+
- test/filtering.rb
|
108
|
+
- test/hash_key.rb
|
109
|
+
- test/helper.rb
|
110
|
+
- test/indices.rb
|
111
|
+
- test/json.rb
|
112
|
+
- test/list.rb
|
113
|
+
- test/model.rb
|
114
|
+
- test/set.rb
|
115
|
+
- test/thread_safety.rb
|
116
|
+
- test/to_hash.rb
|
117
|
+
- test/uniques.rb
|
118
|
+
homepage: https://github.com/xxuejie/sohm
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata: {}
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubyforge_project:
|
138
|
+
rubygems_version: 2.2.2
|
139
|
+
signing_key:
|
140
|
+
specification_version: 4
|
141
|
+
summary: Slim ohm for twemproxy-like system
|
142
|
+
test_files: []
|