ohm 1.2.0 → 1.3.0
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/README.md +1 -1
- data/lib/ohm.rb +16 -13
- data/test/hash_key.rb +4 -0
- data/test/indices.rb +6 -0
- data/test/ranks.rb +21 -0
- data/test/setup.rb +48 -0
- data/test/uniques.rb +38 -0
- metadata +11 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fb164eaa5fbec17afbcceb9a4c7f8ded8ace93b5
|
4
|
+
data.tar.gz: 4ab08c00e7edf980f16e3d854012b3a5e9503b1a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5f3c9c4a0457fd31a0b14eb783840c23e8996e69205fffaacea18ae22efb1c5aa643188d2ddcaf1c2fe584efe2fa5231b58d5997627e7f9f7249b6e52c5b446e
|
7
|
+
data.tar.gz: 6d0e08cd9092c0fce4c41a326163c1cf13a37f2a781020be389bd83d46fa650b8af05785873fb57343cdeb3b7721d341c4c063b1dca38163f835f7e7b8975ee7
|
data/README.md
CHANGED
@@ -633,7 +633,7 @@ Ohm is rather small and can be extended in many ways.
|
|
633
633
|
A lot of amazing contributions are available at [Ohm Contrib][contrib]
|
634
634
|
make sure to check them if you need to extend Ohm's functionality.
|
635
635
|
|
636
|
-
[contrib]: http://cyx.github.com/ohm-contrib/
|
636
|
+
[contrib]: http://cyx.github.com/ohm-contrib/
|
637
637
|
|
638
638
|
Upgrading
|
639
639
|
=========
|
data/lib/ohm.rb
CHANGED
@@ -780,6 +780,8 @@ module Ohm
|
|
780
780
|
# # => true
|
781
781
|
#
|
782
782
|
def self.with(att, val)
|
783
|
+
raise IndexNotFound unless uniques.include?(att)
|
784
|
+
|
783
785
|
id = db.hget(key[:uniques][att], val)
|
784
786
|
id && self[id]
|
785
787
|
end
|
@@ -1019,6 +1021,8 @@ module Ohm
|
|
1019
1021
|
# end
|
1020
1022
|
#
|
1021
1023
|
def self.attribute(name, cast = nil)
|
1024
|
+
attributes << name unless attributes.include?(name)
|
1025
|
+
|
1022
1026
|
if cast
|
1023
1027
|
define_method(name) do
|
1024
1028
|
cast[@attributes[name]]
|
@@ -1396,7 +1400,7 @@ module Ohm
|
|
1396
1400
|
@uniques ||= []
|
1397
1401
|
end
|
1398
1402
|
|
1399
|
-
def self.counters
|
1403
|
+
def self.counters
|
1400
1404
|
@counters ||= []
|
1401
1405
|
end
|
1402
1406
|
|
@@ -1404,6 +1408,10 @@ module Ohm
|
|
1404
1408
|
@collections ||= []
|
1405
1409
|
end
|
1406
1410
|
|
1411
|
+
def self.attributes
|
1412
|
+
@attributes ||= []
|
1413
|
+
end
|
1414
|
+
|
1407
1415
|
def self.filters(dict)
|
1408
1416
|
unless dict.kind_of?(Hash)
|
1409
1417
|
raise ArgumentError,
|
@@ -1411,10 +1419,10 @@ module Ohm
|
|
1411
1419
|
"If you want to find by ID, use #{self}[id] instead."
|
1412
1420
|
end
|
1413
1421
|
|
1414
|
-
dict.map { |k, v|
|
1422
|
+
dict.map { |k, v| to_indices(k, v) }.flatten
|
1415
1423
|
end
|
1416
1424
|
|
1417
|
-
def self.
|
1425
|
+
def self.to_indices(att, val)
|
1418
1426
|
raise IndexNotFound unless indices.include?(att)
|
1419
1427
|
|
1420
1428
|
if val.kind_of?(Enumerable)
|
@@ -1498,28 +1506,23 @@ module Ohm
|
|
1498
1506
|
end
|
1499
1507
|
end
|
1500
1508
|
|
1501
|
-
def _delete_uniques(
|
1502
|
-
|
1509
|
+
def _delete_uniques(uniques)
|
1510
|
+
uniques.each do |unique, val|
|
1503
1511
|
db.hdel(unique, val)
|
1504
1512
|
db.hdel(key[:_uniques], unique)
|
1505
1513
|
end
|
1506
1514
|
end
|
1507
1515
|
|
1508
|
-
def _delete_indices(
|
1509
|
-
|
1516
|
+
def _delete_indices(indices)
|
1517
|
+
indices.each do |index|
|
1510
1518
|
db.srem(index, id)
|
1511
1519
|
db.srem(key[:_indices], index)
|
1512
1520
|
end
|
1513
|
-
# model.indices.each do |att|
|
1514
|
-
# val = atts[att.to_s]
|
1515
|
-
|
1516
|
-
# db.srem(model.key[:indices][att][val], id)
|
1517
|
-
# end
|
1518
1521
|
end
|
1519
1522
|
|
1520
1523
|
def _save_indices(indices)
|
1521
1524
|
indices.each do |att, val|
|
1522
|
-
model.
|
1525
|
+
model.to_indices(att, val).each do |index|
|
1523
1526
|
db.sadd(index, id)
|
1524
1527
|
db.sadd(key[:_indices], index)
|
1525
1528
|
end
|
data/test/hash_key.rb
CHANGED
data/test/indices.rb
CHANGED
@@ -36,6 +36,12 @@ test "be able to find by the given attribute" do
|
|
36
36
|
assert @user1 == User.find(:email => "foo").first
|
37
37
|
end
|
38
38
|
|
39
|
+
test "raise if the index doesn't exist" do
|
40
|
+
assert_raise Ohm::IndexNotFound do
|
41
|
+
User.find(:address => "foo")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
39
45
|
test "raise an error if the parameter supplied is not a hash" do
|
40
46
|
begin
|
41
47
|
User.find(1)
|
data/test/ranks.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
__END__
|
4
|
+
require File.expand_path("./helper", File.dirname(__FILE__))
|
5
|
+
|
6
|
+
class Comment < Ohm::Model
|
7
|
+
def self.ranks
|
8
|
+
@indices ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.rank(attribute)
|
12
|
+
ranks << attribute unless ranks.include?(attribute)
|
13
|
+
end
|
14
|
+
|
15
|
+
def ranked?(attribute)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
setup do
|
20
|
+
User.create(:email => "a@a.com")
|
21
|
+
end
|
data/test/setup.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
+
|
5
|
+
class Event < Ohm::Model
|
6
|
+
attribute :name
|
7
|
+
attribute :location
|
8
|
+
|
9
|
+
def setup
|
10
|
+
txn = Transaction.new do |t|
|
11
|
+
related = nil
|
12
|
+
|
13
|
+
t.watch(key[:related]) unless new?
|
14
|
+
|
15
|
+
t.read do
|
16
|
+
related = db.smembers(key[:related])
|
17
|
+
end
|
18
|
+
|
19
|
+
t.write do
|
20
|
+
related.each do |k|
|
21
|
+
db.del(k)
|
22
|
+
end
|
23
|
+
|
24
|
+
db.del(key[:related])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
__delete__.append(txn)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
test "assign attributes from the hash" do
|
33
|
+
event = Event.new(:name => "Ruby Tuesday")
|
34
|
+
assert_equal event.name, "Ruby Tuesday"
|
35
|
+
end
|
36
|
+
|
37
|
+
test "assign an ID and save the object" do
|
38
|
+
event1 = Event.create(:name => "Ruby Tuesday")
|
39
|
+
event2 = Event.create(:name => "Ruby Meetup")
|
40
|
+
|
41
|
+
assert_equal "1", event1.id
|
42
|
+
assert_equal "2", event2.id
|
43
|
+
end
|
44
|
+
|
45
|
+
test "save the attributes in UTF8" do
|
46
|
+
event = Event.create(:name => "32° Kisei-sen")
|
47
|
+
assert "32° Kisei-sen" == Event[event.id].name
|
48
|
+
end
|
data/test/uniques.rb
CHANGED
@@ -39,6 +39,14 @@ test "raises when it already exists during save" do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
test "raises if the index doesn't exist" do
|
43
|
+
User.create(:email => "b@b.com")
|
44
|
+
|
45
|
+
assert_raise Ohm::IndexNotFound do
|
46
|
+
User.with(:address, "b@b.com")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
42
50
|
test "doesn't raise when saving again and again" do |u|
|
43
51
|
ex = nil
|
44
52
|
|
@@ -85,3 +93,33 @@ test "unique virtual attribute" do
|
|
85
93
|
User.create(:email => "baz@yahoo.com")
|
86
94
|
end
|
87
95
|
end
|
96
|
+
|
97
|
+
test "assert_unique" do |u|
|
98
|
+
class User
|
99
|
+
def assert_unique(att)
|
100
|
+
result = self.class.with(att, send(att))
|
101
|
+
assert((result.nil? || result.eql?(self)), [att, :not_unique])
|
102
|
+
end
|
103
|
+
|
104
|
+
def validate
|
105
|
+
assert_unique :email
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# There's one user with email "a@a.com".
|
110
|
+
user = User.new(:email => "a@a.com")
|
111
|
+
|
112
|
+
# A new user with a conflicting attribute.
|
113
|
+
assert_equal true, user.new?
|
114
|
+
assert_equal false, user.valid?
|
115
|
+
assert_equal [:not_unique], user.errors[:email]
|
116
|
+
|
117
|
+
user.email = "b@b.com"
|
118
|
+
user.save
|
119
|
+
user.email = "a@a.com"
|
120
|
+
|
121
|
+
# An existing user with a conflicting attribute.
|
122
|
+
assert_equal false, user.new?
|
123
|
+
assert_equal false, user.valid?
|
124
|
+
assert_equal [:not_unique], user.errors[:email]
|
125
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michel Martens
|
@@ -11,28 +10,25 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2013-03-29 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: redis
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - '>='
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '0'
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - '>='
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: '0'
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: nest
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
33
|
- - ~>
|
38
34
|
- !ruby/object:Gem::Version
|
@@ -40,7 +36,6 @@ dependencies:
|
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
40
|
- - ~>
|
46
41
|
- !ruby/object:Gem::Version
|
@@ -48,7 +43,6 @@ dependencies:
|
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: scrivener
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
47
|
- - ~>
|
54
48
|
- !ruby/object:Gem::Version
|
@@ -56,7 +50,6 @@ dependencies:
|
|
56
50
|
type: :runtime
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
54
|
- - ~>
|
62
55
|
- !ruby/object:Gem::Version
|
@@ -64,7 +57,6 @@ dependencies:
|
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: cutest
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
61
|
- - ~>
|
70
62
|
- !ruby/object:Gem::Version
|
@@ -72,7 +64,6 @@ dependencies:
|
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
68
|
- - ~>
|
78
69
|
- !ruby/object:Gem::Version
|
@@ -112,32 +103,33 @@ files:
|
|
112
103
|
- test/list.rb
|
113
104
|
- test/model.rb
|
114
105
|
- test/pipeline-performance.rb
|
106
|
+
- test/ranks.rb
|
107
|
+
- test/setup.rb
|
115
108
|
- test/transactions.rb
|
116
109
|
- test/uniques.rb
|
117
110
|
- test/validations.rb
|
118
111
|
- test/test.conf
|
119
112
|
homepage: http://soveran.github.com/ohm/
|
120
113
|
licenses: []
|
114
|
+
metadata: {}
|
121
115
|
post_install_message:
|
122
116
|
rdoc_options: []
|
123
117
|
require_paths:
|
124
118
|
- lib
|
125
119
|
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
-
none: false
|
127
120
|
requirements:
|
128
|
-
- -
|
121
|
+
- - '>='
|
129
122
|
- !ruby/object:Gem::Version
|
130
123
|
version: '0'
|
131
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
125
|
requirements:
|
134
|
-
- -
|
126
|
+
- - '>='
|
135
127
|
- !ruby/object:Gem::Version
|
136
128
|
version: '0'
|
137
129
|
requirements: []
|
138
130
|
rubyforge_project: ohm
|
139
|
-
rubygems_version:
|
131
|
+
rubygems_version: 2.0.3
|
140
132
|
signing_key:
|
141
|
-
specification_version:
|
133
|
+
specification_version: 4
|
142
134
|
summary: Object-hash mapping library for Redis.
|
143
135
|
test_files: []
|