restruct 1.0.0 → 1.1.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/.travis.yml +15 -2
- data/README.md +1 -0
- data/lib/restruct.rb +2 -0
- data/lib/restruct/cache.rb +94 -0
- data/lib/restruct/marshal_cache.rb +5 -0
- data/lib/restruct/marshalizable.rb +1 -1
- data/lib/restruct/version.rb +1 -1
- data/spec/cache_spec.rb +157 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6ca1588dcf0f6ebcb9c04d2e13c5883c03c0264
|
4
|
+
data.tar.gz: 943e2124112da6248e3dced1ddd043fdeb980701
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3ca286a4dd746fa4edf2bdeae09bc014cab33895b8a799dfd893fd9934499a3797a230b901b7a75b220d989e60594cc1027685b102d2dffd2e2f2d57d024847
|
7
|
+
data.tar.gz: a82d2e756549aa096ef6399875628570051d49ba2359e05ca081622a717843b53c73b729e1044ac7e6d45bf24a3345f15adb055a195ae7dd54931de246bdfe91
|
data/.travis.yml
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
2
3
|
rvm:
|
3
4
|
- 1.9.3
|
4
5
|
- 2.0
|
@@ -6,8 +7,20 @@ rvm:
|
|
6
7
|
- 2.2
|
7
8
|
- 2.3.0
|
8
9
|
- 2.4.0
|
9
|
-
-
|
10
|
+
- 2.5.0
|
11
|
+
- jruby-1.7.25
|
12
|
+
- jruby-9.1.7.0
|
13
|
+
- ruby-head
|
14
|
+
- jruby-head
|
15
|
+
|
16
|
+
matrix:
|
17
|
+
fast_finish: true
|
18
|
+
allow_failures:
|
19
|
+
- rvm: ruby-head
|
20
|
+
- rvm: jruby-head
|
21
|
+
|
10
22
|
before_install:
|
11
23
|
- gem install bundler
|
24
|
+
|
12
25
|
services:
|
13
|
-
- redis-server
|
26
|
+
- redis-server
|
data/README.md
CHANGED
data/lib/restruct.rb
CHANGED
@@ -12,12 +12,14 @@ require_relative 'restruct/array'
|
|
12
12
|
require_relative 'restruct/set'
|
13
13
|
require_relative 'restruct/hash'
|
14
14
|
require_relative 'restruct/queue'
|
15
|
+
require_relative 'restruct/cache'
|
15
16
|
require_relative 'restruct/nested_hash'
|
16
17
|
require_relative 'restruct/marshalizable'
|
17
18
|
require_relative 'restruct/marshal_array'
|
18
19
|
require_relative 'restruct/marshal_set'
|
19
20
|
require_relative 'restruct/marshal_hash'
|
20
21
|
require_relative 'restruct/marshal_queue'
|
22
|
+
require_relative 'restruct/marshal_cache'
|
21
23
|
require_relative 'restruct/locker'
|
22
24
|
require_relative 'restruct/connection'
|
23
25
|
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Restruct
|
2
|
+
class Cache < Structure
|
3
|
+
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_reader :ttl
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
super options
|
10
|
+
@ttl = options[:ttl]
|
11
|
+
end
|
12
|
+
|
13
|
+
def key?(key)
|
14
|
+
connection.call('EXISTS', id[key]) == 1
|
15
|
+
end
|
16
|
+
alias_method :has_key?, :key?
|
17
|
+
|
18
|
+
def keys
|
19
|
+
sections = id.sections.count + 1
|
20
|
+
connection.call('KEYS', id['*']).map do |k|
|
21
|
+
Id.new(k).sections.take(sections).last
|
22
|
+
end.uniq.sort
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](key)
|
26
|
+
deserialize connection.call('GET', id[key])
|
27
|
+
end
|
28
|
+
|
29
|
+
def []=(key, value)
|
30
|
+
connection.lazy 'SET', id[key], serialize(value)
|
31
|
+
connection.lazy 'EXPIRE', id[key], ttl if ttl
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(key)
|
35
|
+
value = self[key]
|
36
|
+
connection.lazy 'DEL', id[key]
|
37
|
+
value
|
38
|
+
end
|
39
|
+
|
40
|
+
def fetch(key, &block)
|
41
|
+
if key? key
|
42
|
+
connection.lazy 'EXPIRE', id[key], ttl if ttl
|
43
|
+
self[key]
|
44
|
+
else
|
45
|
+
value = block.call
|
46
|
+
self[key] = value
|
47
|
+
value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def each
|
52
|
+
keys.each { |key| yield key, self[key] }
|
53
|
+
end
|
54
|
+
|
55
|
+
def size
|
56
|
+
keys.count
|
57
|
+
end
|
58
|
+
alias_method :count, :size
|
59
|
+
alias_method :length, :size
|
60
|
+
|
61
|
+
def empty?
|
62
|
+
size == 0
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_h
|
66
|
+
keys.each_with_object({}) do |key, hash|
|
67
|
+
hash[key] = self[key]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
alias_method :to_primitive, :to_h
|
71
|
+
alias_method :dump, :to_h
|
72
|
+
|
73
|
+
def restore(dump)
|
74
|
+
dump.each { |k,v| self[k] = v }
|
75
|
+
end
|
76
|
+
|
77
|
+
def destroy
|
78
|
+
keys.each { |k| connection.lazy 'DEL', id[k] }
|
79
|
+
self
|
80
|
+
end
|
81
|
+
alias_method :clear, :destroy
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def serialize(string)
|
86
|
+
string
|
87
|
+
end
|
88
|
+
|
89
|
+
def deserialize(string)
|
90
|
+
string
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
data/lib/restruct/version.rb
CHANGED
data/spec/cache_spec.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
[Restruct::Cache, Restruct::MarshalCache].each do |klass|
|
4
|
+
|
5
|
+
describe klass do
|
6
|
+
|
7
|
+
let(:sample_cache) { klass.new }
|
8
|
+
|
9
|
+
def fill(data)
|
10
|
+
data.each do |k,v|
|
11
|
+
connection.call 'SET', sample_cache.id[k], sample_cache.send(:serialize, v)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'Getters' do
|
16
|
+
|
17
|
+
it '[]' do
|
18
|
+
fill a: 'x', b: 'y'
|
19
|
+
|
20
|
+
sample_cache[:a].must_equal 'x'
|
21
|
+
sample_cache[:b].must_equal 'y'
|
22
|
+
sample_cache[:c].must_be_nil
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'fetch' do
|
26
|
+
fill a: 'x', b: 'y'
|
27
|
+
|
28
|
+
sample_cache.fetch(:a) { 'z' }.must_equal 'x'
|
29
|
+
sample_cache.fetch(:b) { 'z' }.must_equal 'y'
|
30
|
+
sample_cache.fetch(:c) { 'z' }.must_equal 'z'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'keys' do
|
34
|
+
fill a: 'x', b: 'y', c: 'z'
|
35
|
+
sample_cache.keys.must_equal %w(a b c)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'TTL' do
|
39
|
+
sample_cache = klass.new ttl: 1
|
40
|
+
sample_cache[:a] = 'x'
|
41
|
+
|
42
|
+
sample_cache[:a].must_equal 'x'
|
43
|
+
sleep 1.1
|
44
|
+
sample_cache[:a].must_be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'Setters' do
|
50
|
+
|
51
|
+
it 'delete' do
|
52
|
+
fill a: 'x', b: 'y'
|
53
|
+
|
54
|
+
sample_cache.delete(:b).must_equal 'y'
|
55
|
+
sample_cache.to_h.must_equal 'a' => 'x'
|
56
|
+
|
57
|
+
sample_cache.delete(:c).must_be_nil
|
58
|
+
sample_cache.to_h.must_equal 'a' => 'x'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'clear' do
|
62
|
+
fill a: 'x', b: 'y'
|
63
|
+
|
64
|
+
sample_cache.clear.must_equal sample_cache
|
65
|
+
sample_cache.must_be_empty
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'Info' do
|
71
|
+
|
72
|
+
%w(size count length).each do |method|
|
73
|
+
it method do
|
74
|
+
fill a: 'x', b: 'y'
|
75
|
+
sample_cache.send(method).must_equal 2
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'empty?' do
|
80
|
+
sample_cache.must_be :empty?
|
81
|
+
fill a: 'x', b: 'y'
|
82
|
+
sample_cache.wont_be :empty?
|
83
|
+
end
|
84
|
+
|
85
|
+
%w(key? has_key?).each do |method|
|
86
|
+
it method do
|
87
|
+
fill a: 'x', b: 'y'
|
88
|
+
|
89
|
+
assert sample_cache.send(method, :a)
|
90
|
+
refute sample_cache.send(method, :c)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'Transformations' do
|
97
|
+
|
98
|
+
%w(to_h to_primitive).each do |method|
|
99
|
+
it method do
|
100
|
+
fill a: 'x', b: 'y'
|
101
|
+
sample_cache.send(method).must_equal 'a' => 'x', 'b' => 'y'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'Enumerable' do
|
108
|
+
|
109
|
+
it 'included module' do
|
110
|
+
assert Restruct::Hash.included_modules.include? Enumerable
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'each' do
|
114
|
+
fill a: 'x', b: 'y'
|
115
|
+
|
116
|
+
hash = sample_cache.each_with_object({}) { |(k,v), h| h[k] = v }
|
117
|
+
|
118
|
+
hash.must_equal sample_cache.to_h
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'Equality' do
|
124
|
+
copy = klass.new id: sample_cache.id
|
125
|
+
assert sample_cache == copy
|
126
|
+
assert sample_cache.eql? copy
|
127
|
+
refute sample_cache.equal? copy
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'Dump/Restore' do
|
131
|
+
fill a: 'x', b: 'y'
|
132
|
+
|
133
|
+
dump = sample_cache.dump
|
134
|
+
other = klass.new
|
135
|
+
other.restore dump
|
136
|
+
|
137
|
+
other.id.wont_equal sample_cache.id
|
138
|
+
other.to_primitive.must_equal sample_cache.to_primitive
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'Batch' do
|
142
|
+
fill a: 'x', b: 'y', c: 'z'
|
143
|
+
|
144
|
+
sample_cache.connection.batch do
|
145
|
+
sample_cache[:d] = 'w'
|
146
|
+
sample_cache.delete :a
|
147
|
+
sample_cache[:b] = 'x'
|
148
|
+
|
149
|
+
sample_cache.to_h.must_equal 'a' => 'x', 'b' => 'y', 'c' => 'z'
|
150
|
+
end
|
151
|
+
|
152
|
+
sample_cache.to_h.must_equal 'b' => 'x', 'c' => 'z', 'd' => 'w'
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restruct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redic
|
@@ -196,12 +196,14 @@ files:
|
|
196
196
|
- Rakefile
|
197
197
|
- lib/restruct.rb
|
198
198
|
- lib/restruct/array.rb
|
199
|
+
- lib/restruct/cache.rb
|
199
200
|
- lib/restruct/connection.rb
|
200
201
|
- lib/restruct/errors.rb
|
201
202
|
- lib/restruct/hash.rb
|
202
203
|
- lib/restruct/id.rb
|
203
204
|
- lib/restruct/locker.rb
|
204
205
|
- lib/restruct/marshal_array.rb
|
206
|
+
- lib/restruct/marshal_cache.rb
|
205
207
|
- lib/restruct/marshal_hash.rb
|
206
208
|
- lib/restruct/marshal_queue.rb
|
207
209
|
- lib/restruct/marshal_set.rb
|
@@ -215,6 +217,7 @@ files:
|
|
215
217
|
- lua/unregister.lua
|
216
218
|
- restruct.gemspec
|
217
219
|
- spec/array_spec.rb
|
220
|
+
- spec/cache_spec.rb
|
218
221
|
- spec/connection_spec.rb
|
219
222
|
- spec/coverage_helper.rb
|
220
223
|
- spec/hash_spec.rb
|
@@ -250,6 +253,7 @@ specification_version: 4
|
|
250
253
|
summary: Redis structures
|
251
254
|
test_files:
|
252
255
|
- spec/array_spec.rb
|
256
|
+
- spec/cache_spec.rb
|
253
257
|
- spec/connection_spec.rb
|
254
258
|
- spec/coverage_helper.rb
|
255
259
|
- spec/hash_spec.rb
|