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.
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: []