readthis 0.8.0 → 0.8.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +19 -0
- data/README.md +10 -4
- data/benchmarks/compressed.rb +5 -3
- data/lib/readthis/cache.rb +2 -1
- data/lib/readthis/entity.rb +6 -5
- data/lib/readthis/version.rb +1 -1
- data/spec/readthis/cache_spec.rb +6 -0
- data/spec/readthis/entity_spec.rb +16 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea629e7d22f58baa04359d6fabaee9116caf4e5d
|
4
|
+
data.tar.gz: ff5720742c337be8b178ca840064b3469766dcda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b75d0eb316bb68975693ab64044cc3c30159b9511dde446b504e1075b5c6aa915bc3782290334001de3b921173714343c86110778bc41ec90f67dc84b9ef0704
|
7
|
+
data.tar.gz: 765fae41b2f8d511cd99269e17ed31eacbb968239e97be78422a4b20793ae3325feefc2f19d411b6d0a17722a7b06bbba78230fe49e12c76e01edabb9fc93b43
|
data/.travis.yml
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
|
-
- 2.0.0
|
5
4
|
- 2.1.0
|
6
5
|
- 2.2.2
|
7
6
|
- ruby-head
|
8
7
|
- rbx-2
|
9
8
|
matrix:
|
10
9
|
allow_failures:
|
11
|
-
- rvm: 2.0.0
|
12
10
|
- rvm: ruby-head
|
13
11
|
- rvm: rbx-2
|
14
12
|
services:
|
15
13
|
- redis-server
|
16
14
|
script: bin/rspec
|
15
|
+
bundler_args: --without benchmarking
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## v0.8.1 2015-09-04
|
2
|
+
|
3
|
+
- Changed: `Readthis::Cache` now has an accessor for the options that were
|
4
|
+
passed during initialization. This is primarily to support the session store
|
5
|
+
middleware provided by `ActionDispatch`. See [readthis#16][issue-16].
|
6
|
+
- Fixed: Caching `nil` values is now possible. Previously the value would be
|
7
|
+
converted into a blank string, causing a Marshal error when loading the data.
|
8
|
+
There is still some non-standard handling of `nil` within `fetch` or
|
9
|
+
`fetch_multi`, where a cached `nil` value will always result in a cache miss.
|
10
|
+
See [readthis#15][issue-15].
|
11
|
+
- Fixed: Entity compression was broken, it wouldn't unload data when the
|
12
|
+
compressed size was below the compression limit. Data is now decompressed
|
13
|
+
when it can the value looks to be compressed, falling back to the initial
|
14
|
+
value when decompression fails. See [readthis#13][issue-13] for details.
|
15
|
+
|
16
|
+
[issue-13]: https://github.com/sorentwo/readthis/pull/13
|
17
|
+
[issue-15]: https://github.com/sorentwo/readthis/pull/15
|
18
|
+
[issue-16]: https://github.com/sorentwo/readthis/pull/16
|
19
|
+
|
1
20
|
## v0.8.0 2015-08-26
|
2
21
|
|
3
22
|
- Breaking: The initializer now takes a single options argument instead of a
|
data/README.md
CHANGED
@@ -34,10 +34,11 @@ Use it the same way as any other [ActiveSupport::Cache::Store][store]. Within a
|
|
34
34
|
Rails environment config:
|
35
35
|
|
36
36
|
```ruby
|
37
|
-
config.cache_store = :readthis_store,
|
37
|
+
config.cache_store = :readthis_store, {
|
38
38
|
expires_in: 2.weeks.to_i,
|
39
39
|
namespace: 'cache',
|
40
40
|
redis: { url: ENV.fetch('REDIS_URL'), driver: :hiredis }
|
41
|
+
}
|
41
42
|
```
|
42
43
|
|
43
44
|
Otherwise you can use it anywhere, without any reliance on `ActiveSupport`:
|
@@ -89,9 +90,10 @@ means it is safe to enable or change compression with an existing cache. There
|
|
89
90
|
will be a decoding performance penalty in this case, but it should be minor.
|
90
91
|
|
91
92
|
```ruby
|
92
|
-
config.cache_store = :readthis_store,
|
93
|
+
config.cache_store = :readthis_store, {
|
93
94
|
compress: true,
|
94
95
|
compression_threshold: 2.kilobytes
|
96
|
+
}
|
95
97
|
```
|
96
98
|
|
97
99
|
### Marshalling
|
@@ -118,8 +120,12 @@ Readthis::Cache.new(marshal: Readthis::Passthrough)
|
|
118
120
|
Readthis supports all of standard cache methods except for the following:
|
119
121
|
|
120
122
|
* `cleanup` - Redis does this with TTL or LRU already.
|
121
|
-
* `delete_matched` - You really don't want to perform key matching operations
|
122
|
-
|
123
|
+
* `delete_matched` - You really don't want to perform key matching operations in
|
124
|
+
Redis. They are linear time and only support basic globbing.
|
125
|
+
|
126
|
+
Like other `ActiveSupport::Cache` implementations it is possible to cache `nil`
|
127
|
+
as a value. However, the fetch methods treat `nil` values as a cache miss and
|
128
|
+
re-generate/re-cache the value. Caching `nil` isn't recommended.
|
123
129
|
|
124
130
|
## Contributing
|
125
131
|
|
data/benchmarks/compressed.rb
CHANGED
@@ -39,14 +39,16 @@ TEXT = <<-TEXT
|
|
39
39
|
Caches can also store values in a compressed format to save space and reduce time spent sending data. Since there is overhead, values must be large enough to warrant compression. To turn on compression either pass compress: true in the initializer or as an option to fetch or write. To specify the threshold at which to compress values, set the :compress_threshold option. The default threshold is 16K.
|
40
40
|
TEXT
|
41
41
|
|
42
|
-
puts 'Compressed
|
42
|
+
puts 'Compressed Write/Read:'
|
43
43
|
Benchmark.ips do |x|
|
44
|
-
x.report 'readthis:write' do
|
44
|
+
x.report 'readthis:write/read' do
|
45
45
|
readthis.write(KEY, TEXT)
|
46
|
+
readthis.read(KEY)
|
46
47
|
end
|
47
48
|
|
48
|
-
x.report 'dalli:write' do
|
49
|
+
x.report 'dalli:write/read' do
|
49
50
|
dalli.write(KEY, TEXT)
|
51
|
+
dalli.read(KEY)
|
50
52
|
end
|
51
53
|
|
52
54
|
x.compare!
|
data/lib/readthis/cache.rb
CHANGED
@@ -7,7 +7,7 @@ require 'connection_pool'
|
|
7
7
|
|
8
8
|
module Readthis
|
9
9
|
class Cache
|
10
|
-
attr_reader :entity, :expires_in, :namespace, :pool
|
10
|
+
attr_reader :entity, :expires_in, :namespace, :options, :pool
|
11
11
|
|
12
12
|
# Provide a class level lookup of the proper notifications module.
|
13
13
|
# Instrumention is expected to occur within applications that have
|
@@ -39,6 +39,7 @@ module Readthis
|
|
39
39
|
# Readthis::Cache.new(compress: true, compression_threshold: 2048)
|
40
40
|
#
|
41
41
|
def initialize(options = {})
|
42
|
+
@options = options
|
42
43
|
@expires_in = options.fetch(:expires_in, nil)
|
43
44
|
@namespace = options.fetch(:namespace, nil)
|
44
45
|
|
data/lib/readthis/entity.rb
CHANGED
@@ -3,6 +3,7 @@ require 'zlib'
|
|
3
3
|
module Readthis
|
4
4
|
class Entity
|
5
5
|
DEFAULT_THRESHOLD = 8 * 1024
|
6
|
+
MAGIC_BYTES = [120, 156].freeze
|
6
7
|
|
7
8
|
attr_reader :marshal, :compression, :threshold
|
8
9
|
|
@@ -13,8 +14,6 @@ module Readthis
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def dump(value)
|
16
|
-
return value if value.nil?
|
17
|
-
|
18
17
|
if compress?(value)
|
19
18
|
compress(value)
|
20
19
|
else
|
@@ -23,9 +22,7 @@ module Readthis
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def load(value)
|
26
|
-
|
27
|
-
|
28
|
-
if compress?(value)
|
25
|
+
if compressed?(value)
|
29
26
|
decompress(value)
|
30
27
|
else
|
31
28
|
marshal.load(value)
|
@@ -47,5 +44,9 @@ module Readthis
|
|
47
44
|
def compress?(value)
|
48
45
|
compression && value.bytesize >= threshold
|
49
46
|
end
|
47
|
+
|
48
|
+
def compressed?(value)
|
49
|
+
compression && value[0, 2].unpack('CC') == MAGIC_BYTES
|
50
|
+
end
|
50
51
|
end
|
51
52
|
end
|
data/lib/readthis/version.rb
CHANGED
data/spec/readthis/cache_spec.rb
CHANGED
@@ -19,6 +19,12 @@ RSpec.describe Readthis::Cache do
|
|
19
19
|
|
20
20
|
expect(cache.expires_in).to eq(10)
|
21
21
|
end
|
22
|
+
|
23
|
+
it 'makes options available' do
|
24
|
+
cache = Readthis::Cache.new(namespace: 'cache', expires_in: 1)
|
25
|
+
|
26
|
+
expect(cache.options).to eq(namespace: 'cache', expires_in: 1)
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
30
|
describe '#pool' do
|
@@ -25,10 +25,24 @@ RSpec.describe Readthis::Entity do
|
|
25
25
|
expect(entity.dump(string)).not_to eq(dumped)
|
26
26
|
end
|
27
27
|
|
28
|
-
it 'does not
|
28
|
+
it 'does not return compressed data when the size is below threshold' do
|
29
|
+
string = 'a' * 200
|
30
|
+
entity = Readthis::Entity.new(compress: true, threshold: 50)
|
31
|
+
|
32
|
+
expect(entity.load(entity.dump(string))).to eq(string)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'safely returns incorrectly deduced compressed data' do
|
36
|
+
string = [120, 156, 97, 98, 99].pack('CCCCC')
|
37
|
+
entity = Readthis::Entity.new(compress: true, threshold: 1)
|
38
|
+
|
39
|
+
expect(entity.load(string)).to eq(string)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'safely roundtrips nil values' do
|
29
43
|
entity = Readthis::Entity.new
|
30
44
|
|
31
|
-
expect(entity.dump(nil)).to be_nil
|
45
|
+
expect(entity.load(entity.dump(nil))).to be_nil
|
32
46
|
end
|
33
47
|
end
|
34
48
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: readthis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Parker Selbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|