ohm 2.3.0 → 3.0.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 +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +6 -5
- data/benchmarks/common.rb +0 -5
- data/examples/tagging.rb +2 -2
- data/lib/ohm.rb +70 -27
- data/lib/ohm/json.rb +0 -2
- data/lib/ohm/lua/delete.lua +4 -4
- data/lib/ohm/lua/save.lua +5 -5
- data/ohm.gemspec +1 -2
- data/test/core.rb +2 -2
- data/test/counters.rb +6 -6
- data/test/model.rb +8 -8
- metadata +15 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ecea4a8e9a9d11936a4dd250c91171ae3a47530
|
4
|
+
data.tar.gz: ad07199ffc7506ab69d7193d439cbd5373e41cac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b36d7473878642e18e827de61079b5fd36f083abba8aea39265927f0ad2370b1702bab376b37297d3b0bbb8d487ada008c6f98818cd82de84d9d4698405ec21e
|
7
|
+
data.tar.gz: 8ad17db1d2c0e6d9c4a2c661a75dac9b571cca89f7b542751826852512406a6aebeca58c38838ceb69904920fc63e08be55ab696d34618f23536237d7da7be0c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
## 3.0.0
|
2
|
+
|
3
|
+
- Use JSON instead of msgpack for internal encoding.
|
4
|
+
|
5
|
+
When Ohm started using Lua internally for saving, updating and
|
6
|
+
deleting objects, it used msgpack for serializing. Redis supports
|
7
|
+
both msgpack and JSON, and we picked msgpack because it produces
|
8
|
+
a more compact representation. At some point, the Ruby msgpack
|
9
|
+
library and the internal msgpack support in Redis diverged, and
|
10
|
+
we were forced to lock the dependency to a specific gem version.
|
11
|
+
Recently, some people complained about encoding issues originating
|
12
|
+
from msgpack inside Redis, and once they tried a modified Ohm
|
13
|
+
that uses JSON instead of msgpack, all their issues disappeared.
|
14
|
+
That's why we think it's time for removing msgpack altogether and
|
15
|
+
use JSON instead.
|
16
|
+
|
17
|
+
- Move the raise of MissingID to Ohm::Model#key.
|
18
|
+
|
19
|
+
In previous versions, trying to access an instance's `id` would
|
20
|
+
raise a `MissingID` error. The reason why raising that error is
|
21
|
+
convenient is because it allows Ohm to fail as early as possible
|
22
|
+
when you try to use an object that hasn't been saved yet. The
|
23
|
+
error can arise from comparisons, from direct calls to `id`, and
|
24
|
+
also from any call to methods that need `object.key` to return a
|
25
|
+
proper value, as `key` in turn calls the `id` method. But it turns
|
26
|
+
out that many form builders rely on the fact that sending the
|
27
|
+
`id` message to most ORMs results in either a valid ID or `nil`,
|
28
|
+
and here Ohm was the exception. By moving the check from `id` to
|
29
|
+
`key`, we can keep most of the previous behavior and we can return
|
30
|
+
`nil` when sending the `id` message to a new instance, thus making
|
31
|
+
Ohm compatible with most form builders.
|
32
|
+
|
33
|
+
- Add `Ohm::Model#increment` and `Ohm::Model#decrement`. These methods
|
34
|
+
are aliases of `incr` and `decr` respectively.
|
35
|
+
|
1
36
|
## 2.3.0
|
2
37
|
|
3
38
|
- Retry save and delete if scripts were flushed in the server.
|
data/README.md
CHANGED
@@ -28,6 +28,7 @@ These are libraries in other languages that were inspired by Ohm.
|
|
28
28
|
* [Redisco](https://github.com/iamteem/redisco) for Python, created by iamteem
|
29
29
|
* [redis3m](https://github.com/luca3m/redis3m) for C++, created by luca3m
|
30
30
|
* [Ohmoc](https://github.com/seppo0010/ohmoc) for Objective-C, created by seppo0010
|
31
|
+
* [Sohm](https://github.com/xxuejie/sohm.lua) for Lua, compatible with Twemproxy
|
31
32
|
|
32
33
|
Articles and Presentations
|
33
34
|
--------------------------
|
@@ -162,7 +163,7 @@ Event[2]
|
|
162
163
|
|
163
164
|
# Finding all the events
|
164
165
|
Event.all.to_a
|
165
|
-
# => [<Event:1 name='Ohm Worldwide Conference
|
166
|
+
# => [<Event:1 name='Ohm Worldwide Conference 2032'>]
|
166
167
|
```
|
167
168
|
|
168
169
|
This example shows some basic features, like attribute declarations and
|
@@ -171,9 +172,9 @@ querying. Keep reading to find out what you can do with models.
|
|
171
172
|
Attribute types
|
172
173
|
---------------
|
173
174
|
|
174
|
-
Ohm::Model provides 4 attribute types:
|
175
|
+
Ohm::Model provides 4 attribute types:
|
175
176
|
|
176
|
-
* {Ohm::Model.attribute attribute},
|
177
|
+
* {Ohm::Model.attribute attribute},
|
177
178
|
* {Ohm::Model.set set}
|
178
179
|
* {Ohm::Model.list list}
|
179
180
|
* {Ohm::Model.counter counter}
|
@@ -207,8 +208,8 @@ and for keeping elements in order.
|
|
207
208
|
A `counter` is like a regular attribute, but the direct manipulation
|
208
209
|
of the value is not allowed. You can retrieve, increase or decrease
|
209
210
|
the value, but you can not assign it. In the example above, we used a
|
210
|
-
counter attribute for tracking votes. As the
|
211
|
-
are atomic, you can rest assured a vote won't be counted twice.
|
211
|
+
counter attribute for tracking votes. As the `increment` and `decrement`
|
212
|
+
operations are atomic, you can rest assured a vote won't be counted twice.
|
212
213
|
|
213
214
|
### reference
|
214
215
|
|
data/benchmarks/common.rb
CHANGED
data/examples/tagging.rb
CHANGED
@@ -161,14 +161,14 @@ class Post
|
|
161
161
|
protected
|
162
162
|
def before_update
|
163
163
|
assigned_tags = tags
|
164
|
-
tag(get(:tags)).map(&Tag).each { |t| t.
|
164
|
+
tag(get(:tags)).map(&Tag).each { |t| t.decrement :total }
|
165
165
|
self.tags = assigned_tags
|
166
166
|
end
|
167
167
|
|
168
168
|
# And of course, we increment all new tags for a particular record
|
169
169
|
# after successfully saving it.
|
170
170
|
def after_save
|
171
|
-
tag.map(&Tag).each { |t| t.
|
171
|
+
tag.map(&Tag).each { |t| t.increment :total }
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
data/lib/ohm.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "json"
|
4
4
|
require "nido"
|
5
5
|
require "redic"
|
6
6
|
require "stal"
|
@@ -477,16 +477,28 @@ module Ohm
|
|
477
477
|
sort(options.merge(:by => to_key(att)))
|
478
478
|
end
|
479
479
|
|
480
|
-
#
|
481
|
-
#
|
480
|
+
# Returns the first record of the set. Internally uses `sort` or
|
481
|
+
# `sort_by` if a `:by` option is given. Accepts all options supported
|
482
|
+
# by `sort`.
|
482
483
|
#
|
483
|
-
#
|
484
|
+
# class User < Ohm::Model
|
485
|
+
# attribute :name
|
486
|
+
# end
|
487
|
+
#
|
488
|
+
# User.create(name: "alice")
|
489
|
+
# User.create(name: "bob")
|
490
|
+
# User.create(name: "eve")
|
491
|
+
#
|
492
|
+
# User.all.first.name # => "alice"
|
493
|
+
# User.all.first(by: :name).name # => "alice"
|
494
|
+
#
|
495
|
+
# User.all.first(order: "ASC") # => "alice"
|
496
|
+
# User.all.first(order: "DESC") # => "eve"
|
484
497
|
#
|
485
|
-
#
|
486
|
-
# User.all.sort(:limit => [0, 1]).first
|
498
|
+
# You can use the `:order` option to bring the last record:
|
487
499
|
#
|
488
|
-
# User.all.first(:
|
489
|
-
#
|
500
|
+
# User.all.first(order: "DESC").name # => "eve"
|
501
|
+
# User.all.first(by: :name, order: "ALPHA DESC") # => "eve"
|
490
502
|
#
|
491
503
|
def first(options = {})
|
492
504
|
opts = options.dup
|
@@ -535,9 +547,10 @@ module Ohm
|
|
535
547
|
#
|
536
548
|
# set = User.find(:status => "active")
|
537
549
|
# set.combine(:name => ["John", "Jane"])
|
538
|
-
#
|
550
|
+
#
|
539
551
|
# # The result will include all users with active status
|
540
552
|
# # and with names "John" or "Jane".
|
553
|
+
#
|
541
554
|
def combine(dict)
|
542
555
|
Ohm::Set.new(
|
543
556
|
model, namespace, [:SINTER, key, [:SUNION, *model.filters(dict)]]
|
@@ -652,7 +665,7 @@ module Ohm
|
|
652
665
|
# end
|
653
666
|
#
|
654
667
|
# u = User.create(:name => "John", :email => "foo@bar.com")
|
655
|
-
# u.
|
668
|
+
# u.increment :points
|
656
669
|
# u.posts.add(Post.create)
|
657
670
|
#
|
658
671
|
# When you execute `User.create(...)`, you run the following Redis
|
@@ -1041,9 +1054,9 @@ module Ohm
|
|
1041
1054
|
|
1042
1055
|
# Declare a counter. All the counters are internally stored in
|
1043
1056
|
# a different Redis hash, independent from the one that stores
|
1044
|
-
# the model attributes. Counters are updated with the `
|
1045
|
-
# `
|
1046
|
-
# can't be assigned as with regular attributes.
|
1057
|
+
# the model attributes. Counters are updated with the `increment`
|
1058
|
+
# and `decrement` methods, which interact directly with Redis. Their
|
1059
|
+
# value can't be assigned as with regular attributes.
|
1047
1060
|
#
|
1048
1061
|
# Example:
|
1049
1062
|
#
|
@@ -1052,7 +1065,7 @@ module Ohm
|
|
1052
1065
|
# end
|
1053
1066
|
#
|
1054
1067
|
# u = User.create
|
1055
|
-
# u.
|
1068
|
+
# u.increment :points
|
1056
1069
|
#
|
1057
1070
|
# u.points
|
1058
1071
|
# # => 1
|
@@ -1088,6 +1101,7 @@ module Ohm
|
|
1088
1101
|
# Returns the namespace for the keys generated using this model.
|
1089
1102
|
# Check `Ohm::Model.key` documentation for more details.
|
1090
1103
|
def key
|
1104
|
+
raise MissingID if not defined?(@id)
|
1091
1105
|
model.key[id]
|
1092
1106
|
end
|
1093
1107
|
|
@@ -1118,7 +1132,6 @@ module Ohm
|
|
1118
1132
|
# # => User:1
|
1119
1133
|
#
|
1120
1134
|
def id
|
1121
|
-
raise MissingID if not defined?(@id)
|
1122
1135
|
@id
|
1123
1136
|
end
|
1124
1137
|
|
@@ -1191,20 +1204,50 @@ module Ohm
|
|
1191
1204
|
# u.save
|
1192
1205
|
# u.new?
|
1193
1206
|
# # => false
|
1207
|
+
#
|
1194
1208
|
def new?
|
1195
1209
|
!defined?(@id)
|
1196
1210
|
end
|
1197
1211
|
|
1198
|
-
#
|
1199
|
-
|
1212
|
+
# Increments a counter atomically. Internally uses `HINCRBY`.
|
1213
|
+
#
|
1214
|
+
# class Ad
|
1215
|
+
# counter :hits
|
1216
|
+
# end
|
1217
|
+
#
|
1218
|
+
# ad = Ad.create
|
1219
|
+
#
|
1220
|
+
# ad.increment(:hits)
|
1221
|
+
# ad.hits # => 1
|
1222
|
+
#
|
1223
|
+
# ad.increment(:hits, 2)
|
1224
|
+
# ad.hits # => 3
|
1225
|
+
#
|
1226
|
+
def increment(att, count = 1)
|
1200
1227
|
redis.call("HINCRBY", key[:counters], att, count)
|
1201
1228
|
end
|
1202
1229
|
|
1203
|
-
#
|
1204
|
-
|
1205
|
-
|
1230
|
+
# Decrements a counter atomically. Internally uses `HINCRBY`.
|
1231
|
+
#
|
1232
|
+
# class Post
|
1233
|
+
# counter :score
|
1234
|
+
# end
|
1235
|
+
#
|
1236
|
+
# post = Post.create
|
1237
|
+
#
|
1238
|
+
# post.decrement(:score)
|
1239
|
+
# post.score # => -1
|
1240
|
+
#
|
1241
|
+
# post.decrement(:hits, 2)
|
1242
|
+
# post.score # => -3
|
1243
|
+
#
|
1244
|
+
def decrement(att, count = 1)
|
1245
|
+
increment(att, -count)
|
1206
1246
|
end
|
1207
1247
|
|
1248
|
+
alias_method(:incr, :increment)
|
1249
|
+
alias_method(:decr, :decrement)
|
1250
|
+
|
1208
1251
|
# Return a value that allows the use of models as hash keys.
|
1209
1252
|
#
|
1210
1253
|
# Example:
|
@@ -1305,10 +1348,10 @@ module Ohm
|
|
1305
1348
|
end
|
1306
1349
|
|
1307
1350
|
@id = script(LUA_SAVE, 0,
|
1308
|
-
features.
|
1309
|
-
_sanitized_attributes.
|
1310
|
-
indices.
|
1311
|
-
uniques.
|
1351
|
+
features.to_json,
|
1352
|
+
_sanitized_attributes.to_json,
|
1353
|
+
indices.to_json,
|
1354
|
+
uniques.to_json
|
1312
1355
|
)
|
1313
1356
|
|
1314
1357
|
return self
|
@@ -1330,9 +1373,9 @@ module Ohm
|
|
1330
1373
|
{ "name" => model.name,
|
1331
1374
|
"id" => id,
|
1332
1375
|
"key" => key
|
1333
|
-
}.
|
1334
|
-
uniques.
|
1335
|
-
model.tracked.
|
1376
|
+
}.to_json,
|
1377
|
+
uniques.to_json,
|
1378
|
+
model.tracked.to_json
|
1336
1379
|
)
|
1337
1380
|
|
1338
1381
|
return self
|
data/lib/ohm/json.rb
CHANGED
data/lib/ohm/lua/delete.lua
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
-- This script receives three parameters, all encoded with
|
2
|
-
--
|
2
|
+
-- JSON. The decoded values are used for deleting a model
|
3
3
|
-- instance in Redis and removing any reference to it in sets
|
4
4
|
-- (indices) and hashes (unique indices).
|
5
5
|
--
|
@@ -19,9 +19,9 @@
|
|
19
19
|
-- Keys that share the lifecycle of this model instance, that
|
20
20
|
-- should be removed as this object is deleted.
|
21
21
|
--
|
22
|
-
local model =
|
23
|
-
local uniques =
|
24
|
-
local tracked =
|
22
|
+
local model = cjson.decode(ARGV[1])
|
23
|
+
local uniques = cjson.decode(ARGV[2])
|
24
|
+
local tracked = cjson.decode(ARGV[3])
|
25
25
|
|
26
26
|
local function remove_indices(model)
|
27
27
|
local memo = model.key .. ":_indices"
|
data/lib/ohm/lua/save.lua
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
-- This script receives four parameters, all encoded with
|
2
|
-
--
|
2
|
+
-- JSON. The decoded values are used for saving a model
|
3
3
|
-- instance in Redis, creating or updating a hash as needed and
|
4
4
|
-- updating zero or more sets (indices) and zero or more hashes
|
5
5
|
-- (unique indices).
|
@@ -30,10 +30,10 @@
|
|
30
30
|
-- value), an error is returned with the UniqueIndexViolation
|
31
31
|
-- message and the field that triggered the error.
|
32
32
|
--
|
33
|
-
local model =
|
34
|
-
local attrs =
|
35
|
-
local indices =
|
36
|
-
local uniques =
|
33
|
+
local model = cjson.decode(ARGV[1])
|
34
|
+
local attrs = cjson.decode(ARGV[2])
|
35
|
+
local indices = cjson.decode(ARGV[3])
|
36
|
+
local uniques = cjson.decode(ARGV[4])
|
37
37
|
|
38
38
|
local function save(model, attrs)
|
39
39
|
if model.id == nil then
|
data/ohm.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "ohm"
|
3
|
-
s.version = "
|
3
|
+
s.version = "3.0.0"
|
4
4
|
s.summary = %{Object-hash mapping library for Redis.}
|
5
5
|
s.description = %Q{Ohm is a library that allows to store an object in Redis, a persistent key-value database. It has very good performance.}
|
6
6
|
s.authors = ["Michel Martens", "Damian Janowski", "Cyril David"]
|
@@ -15,7 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_dependency "redic", "~> 1.5.0"
|
16
16
|
s.add_dependency "nido"
|
17
17
|
s.add_dependency "stal"
|
18
|
-
s.add_dependency "msgpack", "~> 0.5.0"
|
19
18
|
|
20
19
|
s.add_development_dependency "cutest"
|
21
20
|
end
|
data/test/core.rb
CHANGED
@@ -19,6 +19,6 @@ test "assign an ID and save the object" do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
test "save the attributes in UTF8" do
|
22
|
-
|
23
|
-
|
22
|
+
event = Event.create(name: "32° Kisei-sen")
|
23
|
+
assert_equal "32° Kisei-sen", Event[event.id].name
|
24
24
|
end
|
data/test/counters.rb
CHANGED
@@ -9,12 +9,12 @@ test "counters aren't overwritten by competing saves" do
|
|
9
9
|
Ad.counter :hits
|
10
10
|
|
11
11
|
instance1 = Ad.create
|
12
|
-
instance1.
|
12
|
+
instance1.increment :hits
|
13
13
|
|
14
14
|
instance2 = Ad[instance1.id]
|
15
15
|
|
16
|
-
instance1.
|
17
|
-
instance1.
|
16
|
+
instance1.increment :hits
|
17
|
+
instance1.increment :hits
|
18
18
|
|
19
19
|
instance2.save
|
20
20
|
|
@@ -31,7 +31,7 @@ test "you can increment counters even when attributes is empty" do
|
|
31
31
|
ex = nil
|
32
32
|
|
33
33
|
begin
|
34
|
-
ad.
|
34
|
+
ad.increment :hits
|
35
35
|
rescue ArgumentError => e
|
36
36
|
ex = e
|
37
37
|
end
|
@@ -44,7 +44,7 @@ test "an attribute gets saved properly" do
|
|
44
44
|
Ad.counter :hits
|
45
45
|
|
46
46
|
ad = Ad.create(:name => "foo")
|
47
|
-
ad.
|
47
|
+
ad.increment :hits, 10
|
48
48
|
assert_equal 10, ad.hits
|
49
49
|
|
50
50
|
# Now let's just load and save it.
|
@@ -59,7 +59,7 @@ test "an attribute gets saved properly" do
|
|
59
59
|
# If we load and save again while we incr behind the scenes,
|
60
60
|
# the latest counter values should be respected.
|
61
61
|
ad = Ad[ad.id]
|
62
|
-
ad.
|
62
|
+
ad.increment :hits, 5
|
63
63
|
ad.save
|
64
64
|
|
65
65
|
ad = Ad[ad.id]
|
data/test/model.rb
CHANGED
@@ -73,7 +73,7 @@ end
|
|
73
73
|
|
74
74
|
test "counters are cleaned up during deletion" do
|
75
75
|
e = Event.create(:name => "Foo")
|
76
|
-
e.
|
76
|
+
e.increment :votes, 10
|
77
77
|
|
78
78
|
assert_equal 10, e.votes
|
79
79
|
|
@@ -286,7 +286,7 @@ end
|
|
286
286
|
test "save counters" do
|
287
287
|
event = Event.create(:name => "Foo")
|
288
288
|
|
289
|
-
event.
|
289
|
+
event.increment(:votes)
|
290
290
|
event.save
|
291
291
|
|
292
292
|
assert_equal 1, Event[event.id].votes
|
@@ -561,7 +561,7 @@ setup do
|
|
561
561
|
@event = Event.create(:name => "Ruby Tuesday")
|
562
562
|
{'D' => 4, 'C' => 2, 'B' => 5, 'A' => 3}.each_pair do |name, logins|
|
563
563
|
person = Person.create(:name => name)
|
564
|
-
person.
|
564
|
+
person.increment :logins, logins
|
565
565
|
@event.attendees.add(person)
|
566
566
|
end
|
567
567
|
end
|
@@ -630,18 +630,18 @@ test "be zero if not initialized" do
|
|
630
630
|
end
|
631
631
|
|
632
632
|
test "be able to increment a counter" do
|
633
|
-
@event.
|
633
|
+
@event.increment(:votes)
|
634
634
|
assert 1 == @event.votes
|
635
635
|
|
636
|
-
@event.
|
636
|
+
@event.increment(:votes, 2)
|
637
637
|
assert 3 == @event.votes
|
638
638
|
end
|
639
639
|
|
640
640
|
test "be able to decrement a counter" do
|
641
|
-
@event.
|
641
|
+
@event.decrement(:votes)
|
642
642
|
assert @event.votes == -1
|
643
643
|
|
644
|
-
@event.
|
644
|
+
@event.decrement(:votes, 2)
|
645
645
|
assert @event.votes == -3
|
646
646
|
end
|
647
647
|
|
@@ -739,7 +739,7 @@ end
|
|
739
739
|
# Persistence
|
740
740
|
test "persist attributes to a hash" do
|
741
741
|
event = Event.create(:name => "Redis Meetup")
|
742
|
-
event.
|
742
|
+
event.increment(:votes)
|
743
743
|
|
744
744
|
assert "hash" == Ohm.redis.call("TYPE", "Event:1")
|
745
745
|
|
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:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
@@ -10,76 +10,62 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2016-04-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: redic
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - ~>
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 1.5.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - ~>
|
26
|
+
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: 1.5.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: nido
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '0'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: stal
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '0'
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- -
|
54
|
+
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '0'
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: msgpack
|
59
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
-
requirements:
|
61
|
-
- - ~>
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: 0.5.0
|
64
|
-
type: :runtime
|
65
|
-
prerelease: false
|
66
|
-
version_requirements: !ruby/object:Gem::Requirement
|
67
|
-
requirements:
|
68
|
-
- - ~>
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 0.5.0
|
71
57
|
- !ruby/object:Gem::Dependency
|
72
58
|
name: cutest
|
73
59
|
requirement: !ruby/object:Gem::Requirement
|
74
60
|
requirements:
|
75
|
-
- -
|
61
|
+
- - ">="
|
76
62
|
- !ruby/object:Gem::Version
|
77
63
|
version: '0'
|
78
64
|
type: :development
|
79
65
|
prerelease: false
|
80
66
|
version_requirements: !ruby/object:Gem::Requirement
|
81
67
|
requirements:
|
82
|
-
- -
|
68
|
+
- - ">="
|
83
69
|
- !ruby/object:Gem::Version
|
84
70
|
version: '0'
|
85
71
|
description: Ohm is a library that allows to store an object in Redis, a persistent
|
@@ -92,8 +78,8 @@ executables: []
|
|
92
78
|
extensions: []
|
93
79
|
extra_rdoc_files: []
|
94
80
|
files:
|
95
|
-
- .gems
|
96
|
-
- .gitignore
|
81
|
+
- ".gems"
|
82
|
+
- ".gitignore"
|
97
83
|
- CHANGELOG.md
|
98
84
|
- CONTRIBUTING
|
99
85
|
- LICENSE
|
@@ -141,17 +127,17 @@ require_paths:
|
|
141
127
|
- lib
|
142
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
143
129
|
requirements:
|
144
|
-
- -
|
130
|
+
- - ">="
|
145
131
|
- !ruby/object:Gem::Version
|
146
132
|
version: '0'
|
147
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
134
|
requirements:
|
149
|
-
- -
|
135
|
+
- - ">="
|
150
136
|
- !ruby/object:Gem::Version
|
151
137
|
version: '0'
|
152
138
|
requirements: []
|
153
139
|
rubyforge_project: ohm
|
154
|
-
rubygems_version: 2.
|
140
|
+
rubygems_version: 2.4.5.1
|
155
141
|
signing_key:
|
156
142
|
specification_version: 4
|
157
143
|
summary: Object-hash mapping library for Redis.
|