redis_object 1.2.3 → 1.2.4
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 +8 -8
- data/.rspec +2 -0
- data/.travis.yml +1 -0
- data/Gemfile +5 -0
- data/Guardfile +5 -0
- data/README.markdown +1 -0
- data/lib/redis_object.rb +2 -2
- data/lib/redis_object/base.rb +13 -11
- data/lib/redis_object/collection.rb +7 -0
- data/lib/redis_object/experimental/dumping.rb +95 -0
- data/lib/redis_object/experimental/{history.rb → history_untested.rb} +0 -0
- data/lib/redis_object/storage/adapter.rb +1 -2
- data/lib/redis_object/storage/redis.rb +6 -3
- data/lib/redis_object/version.rb +1 -1
- data/redis_object.gemspec +5 -4
- data/spec/base_spec.rb +12 -0
- data/spec/collections_spec.rb +33 -1
- data/spec/dumping_spec.rb +60 -0
- data/spec/indices_spec.rb +3 -0
- data/spec/spec_helper.rb +5 -1
- metadata +30 -11
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWZkNGY4Y2M4ZjI3YzEwY2NlMzgyNDlkNTBmMjc0ODY1NjUwZDhhMw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmExZDRhNDYwNWU3NjI2N2U4OTgyMGE4MTE2Yzg4NjNhNWQ5MDhmOQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjI1ZjUyNGEyNzY0NTUxODljNmJhNTBiODcyNzIzNjllYjM5NjdmNmM4MGM5
|
10
|
+
MjRjNjQ1NDVmMTBmZGE4NGE1NGMyMDBkZmY1ZTlhY2ZlYWY1MDg2NmNjNGJi
|
11
|
+
ZGE0NDM5ODc5MWFhZWZlYzg2ZmRiNGRmMjVkZWI4ODZhMDM2YjM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDEwYzc3NWRkYWVlYjk2NzFkMjI4MDcxMjVmZGViYTJhZDk5MDdmODkwMjQ5
|
14
|
+
NWVjNjg4MjE1MDRmMjE5ZmUzMjRkNTM5NDlkMDE0YmE5MTY3YjMxNjIwNTc2
|
15
|
+
OTJhZDI2YWZiYmM0M2JmNDU0YWQ1ODQyYThhNTRjODhjMmY2Yzc=
|
data/.rspec
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Guardfile
ADDED
data/README.markdown
CHANGED
@@ -4,6 +4,7 @@ RedisObject is a fast and simple-to-use object persistence layer for Ruby.
|
|
4
4
|
[](https://travis-ci.org/remotezygote/RedisObject)
|
5
5
|
[](https://coveralls.io/r/remotezygote/RedisObject?branch=master)
|
6
6
|
[](https://codeclimate.com/github/remotezygote/RedisObject)
|
7
|
+
[](https://gemnasium.com/remotezygote/RedisObject)
|
7
8
|
|
8
9
|
## Prerequisites
|
9
10
|
You'll need [Redis](http://redis.io). Other storage adapters are in the works. Maybe.
|
data/lib/redis_object.rb
CHANGED
@@ -14,7 +14,7 @@ require "redis_object/defaults"
|
|
14
14
|
require "redis_object/collection"
|
15
15
|
require "redis_object/indices"
|
16
16
|
require "redis_object/timestamps"
|
17
|
-
require "redis_object/experimental/
|
17
|
+
require "redis_object/experimental/dumping"
|
18
18
|
require "redis_object/ext/views"
|
19
19
|
require "redis_object/ext/view_caching"
|
20
20
|
require "redis_object/ext/triggers"
|
@@ -38,8 +38,8 @@ module Seabright
|
|
38
38
|
include Seabright::Views
|
39
39
|
include Seabright::ViewCaching
|
40
40
|
include Seabright::Timestamps
|
41
|
-
include Seabright::History
|
42
41
|
include Seabright::Benchmark
|
42
|
+
include Seabright::Dumping
|
43
43
|
|
44
44
|
end
|
45
45
|
end
|
data/lib/redis_object/base.rb
CHANGED
@@ -25,9 +25,10 @@ module Seabright
|
|
25
25
|
self.class.reserve(k)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
# oved this to the dumper module in experimental - remove when it gets to base
|
29
|
+
# def to_json
|
30
|
+
# Yajl::Encoder.encode(actual)
|
31
|
+
# end
|
31
32
|
|
32
33
|
def id
|
33
34
|
@id || get(id_sym) || set(id_sym, generate_id)
|
@@ -188,14 +189,15 @@ module Seabright
|
|
188
189
|
"#{cls.split('::').last.downcase}_id".to_sym
|
189
190
|
end
|
190
191
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
end
|
198
|
-
|
192
|
+
# Not used yet...
|
193
|
+
# def load_all_hash_values
|
194
|
+
# @cached_hash_values = store.hgetall(hkey)
|
195
|
+
# cached_hash_values.keys.dup.each do |key|
|
196
|
+
# next if key == "class"
|
197
|
+
# define_setter_getter(key)
|
198
|
+
# end
|
199
|
+
# end
|
200
|
+
#
|
199
201
|
def cached_hash_values
|
200
202
|
@cached_hash_values ||= {}
|
201
203
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'psych'
|
2
|
+
require 'active_support/core_ext/time/calculations'
|
3
|
+
|
4
|
+
module Seabright
|
5
|
+
class RedisObject
|
6
|
+
|
7
|
+
def self.dump_everything(file=nil)
|
8
|
+
out = {}
|
9
|
+
ObjectSpace.enum_for(:each_object, class << RedisObject; self; end).each do |cls|
|
10
|
+
unless cls == RedisObject
|
11
|
+
out[cls.name] = {}
|
12
|
+
out[cls.name][:objects] = cls.all.map do |obj|
|
13
|
+
obj.full_hash_dump
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
Psych.dump(out)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.load_dump(str)
|
21
|
+
Psych.load(str).each do |(k,v)|
|
22
|
+
if klass = RedisObject.deep_const_get(k)
|
23
|
+
if v[:objects]
|
24
|
+
v[:objects].each do |o|
|
25
|
+
load_object klass, o
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.load_object(klass,pkt)
|
33
|
+
puts "Loading a #{klass.name}: #{pkt.inspect}" if DEBUG
|
34
|
+
cols = nil
|
35
|
+
pkt.delete(:collections).each do |col_name|
|
36
|
+
if objs = pkt.delete(col_name.to_sym)
|
37
|
+
cols ||= {}
|
38
|
+
cols[col_name.to_sym] = objs
|
39
|
+
end
|
40
|
+
end
|
41
|
+
obj = klass.create(pkt)
|
42
|
+
if cols
|
43
|
+
cols.each do |name,objs|
|
44
|
+
puts " Loading in collected #{name}: #{objs.inspect}" if DEBUG
|
45
|
+
obj.collect_type_by_key name, *objs
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
module Dumping
|
53
|
+
|
54
|
+
# def dump(file=nil)
|
55
|
+
# if file && File.exists?(file)
|
56
|
+
# #
|
57
|
+
# else
|
58
|
+
# self.to_yaml
|
59
|
+
# end
|
60
|
+
# end
|
61
|
+
|
62
|
+
def full_hash_dump
|
63
|
+
store.hgetall(hkey).inject({}) {|acc,(k,v)| acc[k.to_sym] = enforce_format(k,v); acc }.merge(dump_collections)
|
64
|
+
end
|
65
|
+
|
66
|
+
def dump_collections
|
67
|
+
cols = []
|
68
|
+
collections.inject({}) do |acc,(k,v)|
|
69
|
+
acc[k.to_sym] = v.map {|o| o.hkey }
|
70
|
+
cols << k
|
71
|
+
acc
|
72
|
+
end.merge(collections: cols)
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_json
|
76
|
+
Yajl::Encoder.encode(full_hash_dump)
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_yaml
|
80
|
+
Psych.dump(full_hash_dump)
|
81
|
+
end
|
82
|
+
alias_method :to_yml, :to_yaml
|
83
|
+
|
84
|
+
module ClassMethods
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.included(base)
|
91
|
+
base.extend(ClassMethods)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
File without changes
|
@@ -27,9 +27,12 @@ module Seabright
|
|
27
27
|
File.open(file,'wb') do |f|
|
28
28
|
keys = connection.send(:keys,"*")
|
29
29
|
f.write keys.map {|k|
|
30
|
-
v = connection.dump(k)
|
31
|
-
|
32
|
-
|
30
|
+
if v = connection.dump(k)
|
31
|
+
v.force_encoding(Encoding::BINARY)
|
32
|
+
[k,v].join(DUMP_SEPARATOR)
|
33
|
+
else
|
34
|
+
""
|
35
|
+
end
|
33
36
|
}.join(REC_SEPARATOR)
|
34
37
|
end
|
35
38
|
end
|
data/lib/redis_object/version.rb
CHANGED
data/redis_object.gemspec
CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
s.required_ruby_version = '>= 1.9.2'
|
22
|
-
s.add_dependency "utf8_utils"
|
23
|
-
s.add_dependency "redis"
|
24
|
-
s.add_dependency "yajl-ruby"
|
25
|
-
s.add_dependency "activesupport"
|
22
|
+
s.add_dependency "utf8_utils", ">= 2.0.1"
|
23
|
+
s.add_dependency "redis", ">= 3.0.4"
|
24
|
+
s.add_dependency "yajl-ruby", ">= 1.1.0"
|
25
|
+
s.add_dependency "activesupport", ">= 3.2.13"
|
26
|
+
s.add_dependency "psych", "= 1.3.4"
|
26
27
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -87,4 +87,16 @@ describe RedisObject do
|
|
87
87
|
ObjectTests::User.find("test").should be_nil
|
88
88
|
end
|
89
89
|
|
90
|
+
it "can dump itself raw-ly" do
|
91
|
+
obj = ObjectTests::User.create("testy")
|
92
|
+
obj.test = true
|
93
|
+
obj.raw.should be_a(Hash)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "can iterate through instances with each" do
|
97
|
+
ObjectTests::User.each do |obj|
|
98
|
+
obj.should be_a(ObjectTests::User)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
90
102
|
end
|
data/spec/collections_spec.rb
CHANGED
@@ -19,7 +19,7 @@ module CollectionSpec
|
|
19
19
|
GrandDad << @dad
|
20
20
|
@granddad << @dad
|
21
21
|
@granddad << @son
|
22
|
-
@dad
|
22
|
+
@dad.push @son
|
23
23
|
@dad.push @sonny
|
24
24
|
@son.reference @grandson
|
25
25
|
|
@@ -30,6 +30,7 @@ module CollectionSpec
|
|
30
30
|
@granddad.daddies.count.should eq(1)
|
31
31
|
@granddad.sons.count.should eq(1)
|
32
32
|
@dad.sons.count.should eq(2)
|
33
|
+
@dad.sons.push Son.create
|
33
34
|
|
34
35
|
end
|
35
36
|
|
@@ -61,6 +62,10 @@ module CollectionSpec
|
|
61
62
|
|
62
63
|
@dad = Daddy.find("dad")
|
63
64
|
@dad.sons.find(son_id: "sonny").first.should be_a(Son)
|
65
|
+
@dad.sons[0].should be_a(Son)
|
66
|
+
@dad.sons.first.should be_a(Son)
|
67
|
+
@dad.sons.last.should be_a(Son)
|
68
|
+
@dad.sons.objects.first.should be_a(Son)
|
64
69
|
|
65
70
|
end
|
66
71
|
|
@@ -113,6 +118,22 @@ module CollectionSpec
|
|
113
118
|
|
114
119
|
end
|
115
120
|
|
121
|
+
it "can delete a collection another way" do
|
122
|
+
|
123
|
+
@dad.remove_collection! :sons
|
124
|
+
@dad.collections.keys.should_not include(:sons)
|
125
|
+
@son.remove_collection!(:grand_sons)
|
126
|
+
@son.collections.keys.should_not include(:grand_sons)
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
it "can select a block of objects" do
|
131
|
+
|
132
|
+
i = @dad.sons.last.id
|
133
|
+
@dad.sons.select {|o| o.id == i }.count.should > 0
|
134
|
+
|
135
|
+
end
|
136
|
+
|
116
137
|
it "retrieves via index" do
|
117
138
|
|
118
139
|
5.times do
|
@@ -140,5 +161,16 @@ module CollectionSpec
|
|
140
161
|
|
141
162
|
end
|
142
163
|
|
164
|
+
it "can remove a collection from a class itself" do
|
165
|
+
|
166
|
+
5.times do
|
167
|
+
Daddy.push Son.create
|
168
|
+
end
|
169
|
+
|
170
|
+
Daddy.remove_collection! :sons
|
171
|
+
# Daddy.get(:sons).indexed(:created_at,3,true).count.should eq(3)
|
172
|
+
|
173
|
+
end
|
174
|
+
|
143
175
|
end
|
144
176
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
module DumpingSpec
|
4
|
+
|
5
|
+
class DumpableObject < RedisObject
|
6
|
+
|
7
|
+
int :phone
|
8
|
+
bool :mailed
|
9
|
+
date :canceled_at
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class GenericObject < RedisObject
|
14
|
+
|
15
|
+
json :complex
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
describe Seabright::Triggers do
|
20
|
+
before do
|
21
|
+
RedisObject.store.flushdb
|
22
|
+
5.times do
|
23
|
+
d = DumpableObject.create(phone: Random.rand(100)*555, mailed: true, canceled_at: Time.now)
|
24
|
+
d << GenericObject.create(complex: {woot: true, ohnoes: false})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can dump an object" do
|
29
|
+
|
30
|
+
r = DumpableObject.latest.to_yaml
|
31
|
+
r.size.should > 100
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can dump to json" do
|
36
|
+
|
37
|
+
r = DumpableObject.latest.to_json
|
38
|
+
r.size.should > 100
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
it "can dump errthing" do
|
43
|
+
|
44
|
+
r = RedisObject.dump_everything
|
45
|
+
r.size.should > 100
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
it "can load back in a dump" do
|
50
|
+
|
51
|
+
r = RedisObject.dump_everything
|
52
|
+
r.size.should > 100
|
53
|
+
RedisObject.store.flushdb
|
54
|
+
RedisObject.load_dump r
|
55
|
+
DumpableObject.latest.generic_objects.count.should eq(1)
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
data/spec/indices_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -14,8 +14,12 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
|
14
14
|
]
|
15
15
|
SimpleCov.start do
|
16
16
|
add_filter "_spec.rb"
|
17
|
-
add_filter "/experimental/"
|
17
|
+
# add_filter "/experimental/"
|
18
18
|
add_group "Extensions", "lib/redis_object/ext/"
|
19
|
+
add_group "Experimental", "lib/redis_object/experimental/" do |fl|
|
20
|
+
!/_untested/.match(fl)
|
21
|
+
end
|
22
|
+
maximum_coverage_drop 5
|
19
23
|
end
|
20
24
|
|
21
25
|
require 'redis_object'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Bragg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: utf8_utils
|
@@ -16,56 +16,70 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.0.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.0.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 3.0.4
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 3.0.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: yajl-ruby
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.1.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.1.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activesupport
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 3.2.13
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 3.2.13
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: psych
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.3.4
|
69
83
|
description: ''
|
70
84
|
email:
|
71
85
|
- john@seabrightstudios.com
|
@@ -75,15 +89,18 @@ extra_rdoc_files: []
|
|
75
89
|
files:
|
76
90
|
- .coveralls.yml
|
77
91
|
- .gitignore
|
92
|
+
- .rspec
|
78
93
|
- .travis.yml
|
79
94
|
- Gemfile
|
95
|
+
- Guardfile
|
80
96
|
- README.markdown
|
81
97
|
- Rakefile
|
82
98
|
- lib/redis_object.rb
|
83
99
|
- lib/redis_object/base.rb
|
84
100
|
- lib/redis_object/collection.rb
|
85
101
|
- lib/redis_object/defaults.rb
|
86
|
-
- lib/redis_object/experimental/
|
102
|
+
- lib/redis_object/experimental/dumping.rb
|
103
|
+
- lib/redis_object/experimental/history_untested.rb
|
87
104
|
- lib/redis_object/ext/benchmark.rb
|
88
105
|
- lib/redis_object/ext/cleaner.rb
|
89
106
|
- lib/redis_object/ext/filters.rb
|
@@ -118,6 +135,7 @@ files:
|
|
118
135
|
- spec/benchmark_spec.rb
|
119
136
|
- spec/collections_spec.rb
|
120
137
|
- spec/defaults_spec.rb
|
138
|
+
- spec/dumping_spec.rb
|
121
139
|
- spec/field_ref_spec.rb
|
122
140
|
- spec/filters_spec.rb
|
123
141
|
- spec/indices_spec.rb
|
@@ -159,6 +177,7 @@ test_files:
|
|
159
177
|
- spec/benchmark_spec.rb
|
160
178
|
- spec/collections_spec.rb
|
161
179
|
- spec/defaults_spec.rb
|
180
|
+
- spec/dumping_spec.rb
|
162
181
|
- spec/field_ref_spec.rb
|
163
182
|
- spec/filters_spec.rb
|
164
183
|
- spec/indices_spec.rb
|