juno 0.2.5 → 0.2.6
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.
- data/.travis.yml +5 -1
- data/Gemfile +27 -21
- data/README.md +41 -2
- data/Rakefile +3 -3
- data/juno.gemspec +12 -12
- data/lib/juno.rb +4 -4
- data/lib/juno/adapters/couch.rb +1 -1
- data/lib/juno/adapters/datamapper.rb +1 -1
- data/lib/juno/adapters/dbm.rb +1 -1
- data/lib/juno/adapters/file.rb +1 -1
- data/lib/juno/adapters/fog.rb +1 -1
- data/lib/juno/adapters/gdbm.rb +1 -1
- data/lib/juno/adapters/localmemcache.rb +1 -1
- data/lib/juno/adapters/pstore.rb +1 -1
- data/lib/juno/adapters/redis.rb +3 -2
- data/lib/juno/adapters/sdbm.rb +1 -1
- data/lib/juno/adapters/sequel.rb +1 -1
- data/lib/juno/adapters/sqlite.rb +1 -1
- data/lib/juno/adapters/tokyocabinet.rb +1 -1
- data/lib/juno/builder.rb +10 -0
- data/lib/juno/cache.rb +1 -0
- data/lib/juno/expires.rb +1 -1
- data/lib/juno/proxy.rb +2 -0
- data/lib/juno/stack.rb +1 -0
- data/lib/juno/transformer.rb +34 -18
- data/lib/juno/version.rb +1 -1
- data/lib/rack/cache/juno.rb +93 -0
- data/lib/rack/session/juno.rb +63 -0
- data/spec/generate.rb +41 -2
- data/spec/{adapter_activerecord_spec.rb → juno/adapter_activerecord_spec.rb} +0 -0
- data/spec/{adapter_cassandra_spec.rb → juno/adapter_cassandra_spec.rb} +0 -0
- data/spec/{adapter_couch_spec.rb → juno/adapter_couch_spec.rb} +0 -0
- data/spec/{adapter_datamapper_spec.rb → juno/adapter_datamapper_spec.rb} +0 -0
- data/spec/{adapter_dbm_spec.rb → juno/adapter_dbm_spec.rb} +0 -0
- data/spec/{adapter_file_spec.rb → juno/adapter_file_spec.rb} +0 -0
- data/spec/{adapter_fog_spec.rb → juno/adapter_fog_spec.rb} +0 -0
- data/spec/{adapter_gdbm_spec.rb → juno/adapter_gdbm_spec.rb} +0 -0
- data/spec/{adapter_localmemcache_spec.rb → juno/adapter_localmemcache_spec.rb} +0 -0
- data/spec/{adapter_lruhash_spec.rb → juno/adapter_lruhash_spec.rb} +0 -0
- data/spec/{adapter_memcached_dalli_spec.rb → juno/adapter_memcached_dalli_spec.rb} +0 -0
- data/spec/{adapter_memcached_native_spec.rb → juno/adapter_memcached_native_spec.rb} +0 -0
- data/spec/{adapter_memcached_spec.rb → juno/adapter_memcached_spec.rb} +0 -0
- data/spec/{adapter_memory_spec.rb → juno/adapter_memory_spec.rb} +0 -0
- data/spec/{adapter_mongo_spec.rb → juno/adapter_mongo_spec.rb} +0 -0
- data/spec/{adapter_pstore_spec.rb → juno/adapter_pstore_spec.rb} +0 -0
- data/spec/{adapter_redis_spec.rb → juno/adapter_redis_spec.rb} +0 -0
- data/spec/{adapter_riak_spec.rb → juno/adapter_riak_spec.rb} +0 -0
- data/spec/{adapter_sdbm_spec.rb → juno/adapter_sdbm_spec.rb} +0 -0
- data/spec/{adapter_sequel_spec.rb → juno/adapter_sequel_spec.rb} +0 -0
- data/spec/{adapter_sqlite_spec.rb → juno/adapter_sqlite_spec.rb} +0 -0
- data/spec/{adapter_tokyocabinet_bdb_spec.rb → juno/adapter_tokyocabinet_bdb_spec.rb} +0 -0
- data/spec/{adapter_tokyocabinet_hdb_spec.rb → juno/adapter_tokyocabinet_hdb_spec.rb} +0 -0
- data/spec/{adapter_yaml_spec.rb → juno/adapter_yaml_spec.rb} +0 -0
- data/spec/{cache_file_memory_spec.rb → juno/cache_file_memory_spec.rb} +0 -0
- data/spec/{cache_memory_null_spec.rb → juno/cache_memory_null_spec.rb} +0 -0
- data/spec/{expires_file_spec.rb → juno/expires_file_spec.rb} +0 -0
- data/spec/{expires_memory_spec.rb → juno/expires_memory_spec.rb} +0 -0
- data/spec/{lock_spec.rb → juno/lock_spec.rb} +0 -0
- data/spec/{null_adapter_spec.rb → juno/null_adapter_spec.rb} +0 -0
- data/spec/{proxy_expires_memory_spec.rb → juno/proxy_expires_memory_spec.rb} +0 -0
- data/spec/{proxy_redis_spec.rb → juno/proxy_redis_spec.rb} +0 -0
- data/spec/{simple_activerecord_spec.rb → juno/simple_activerecord_spec.rb} +0 -0
- data/spec/{simple_activerecord_with_expires_spec.rb → juno/simple_activerecord_with_expires_spec.rb} +0 -0
- data/spec/{simple_cassandra_spec.rb → juno/simple_cassandra_spec.rb} +0 -0
- data/spec/{simple_couch_spec.rb → juno/simple_couch_spec.rb} +0 -0
- data/spec/{simple_couch_with_expires_spec.rb → juno/simple_couch_with_expires_spec.rb} +0 -0
- data/spec/{simple_datamapper_spec.rb → juno/simple_datamapper_spec.rb} +0 -0
- data/spec/{simple_datamapper_with_expires_spec.rb → juno/simple_datamapper_with_expires_spec.rb} +0 -0
- data/spec/{simple_datamapper_with_repository_spec.rb → juno/simple_datamapper_with_repository_spec.rb} +0 -0
- data/spec/{simple_dbm_spec.rb → juno/simple_dbm_spec.rb} +0 -0
- data/spec/{simple_dbm_with_expires_spec.rb → juno/simple_dbm_with_expires_spec.rb} +0 -0
- data/spec/{simple_file_spec.rb → juno/simple_file_spec.rb} +0 -0
- data/spec/{simple_file_with_expires_spec.rb → juno/simple_file_with_expires_spec.rb} +0 -0
- data/spec/{simple_fog_spec.rb → juno/simple_fog_spec.rb} +0 -0
- data/spec/{simple_fog_with_expires_spec.rb → juno/simple_fog_with_expires_spec.rb} +0 -0
- data/spec/{simple_gdbm_spec.rb → juno/simple_gdbm_spec.rb} +0 -0
- data/spec/{simple_gdbm_with_expires_spec.rb → juno/simple_gdbm_with_expires_spec.rb} +0 -0
- data/spec/{simple_hashfile_spec.rb → juno/simple_hashfile_spec.rb} +0 -0
- data/spec/{simple_hashfile_with_expires_spec.rb → juno/simple_hashfile_with_expires_spec.rb} +0 -0
- data/spec/{simple_localmemcache_spec.rb → juno/simple_localmemcache_spec.rb} +0 -0
- data/spec/{simple_localmemcache_with_expires_spec.rb → juno/simple_localmemcache_with_expires_spec.rb} +0 -0
- data/spec/{simple_lruhash_spec.rb → juno/simple_lruhash_spec.rb} +0 -0
- data/spec/{simple_lruhash_with_expires_spec.rb → juno/simple_lruhash_with_expires_spec.rb} +0 -0
- data/spec/{simple_memcached_dalli_spec.rb → juno/simple_memcached_dalli_spec.rb} +0 -0
- data/spec/{simple_memcached_native_spec.rb → juno/simple_memcached_native_spec.rb} +0 -0
- data/spec/{simple_memcached_spec.rb → juno/simple_memcached_spec.rb} +0 -0
- data/spec/{simple_memory_spec.rb → juno/simple_memory_spec.rb} +0 -0
- data/spec/{simple_memory_with_expires_spec.rb → juno/simple_memory_with_expires_spec.rb} +0 -0
- data/spec/{simple_mongo_spec.rb → juno/simple_mongo_spec.rb} +0 -0
- data/spec/{simple_mongo_with_expires_spec.rb → juno/simple_mongo_with_expires_spec.rb} +0 -0
- data/spec/{simple_null_spec.rb → juno/simple_null_spec.rb} +0 -0
- data/spec/{simple_pstore_spec.rb → juno/simple_pstore_spec.rb} +0 -0
- data/spec/{simple_pstore_with_expires_spec.rb → juno/simple_pstore_with_expires_spec.rb} +0 -0
- data/spec/{simple_redis_spec.rb → juno/simple_redis_spec.rb} +0 -0
- data/spec/{simple_riak_spec.rb → juno/simple_riak_spec.rb} +0 -0
- data/spec/{simple_riak_with_expires_spec.rb → juno/simple_riak_with_expires_spec.rb} +0 -0
- data/spec/{simple_sdbm_spec.rb → juno/simple_sdbm_spec.rb} +0 -0
- data/spec/{simple_sdbm_with_expires_spec.rb → juno/simple_sdbm_with_expires_spec.rb} +0 -0
- data/spec/{simple_sequel_spec.rb → juno/simple_sequel_spec.rb} +0 -0
- data/spec/{simple_sequel_with_expires_spec.rb → juno/simple_sequel_with_expires_spec.rb} +0 -0
- data/spec/{simple_sqlite_spec.rb → juno/simple_sqlite_spec.rb} +0 -0
- data/spec/{simple_sqlite_with_expires_spec.rb → juno/simple_sqlite_with_expires_spec.rb} +0 -0
- data/spec/{simple_tokyocabinet_spec.rb → juno/simple_tokyocabinet_spec.rb} +0 -0
- data/spec/{simple_tokyocabinet_with_expires_spec.rb → juno/simple_tokyocabinet_with_expires_spec.rb} +0 -0
- data/spec/{simple_yaml_spec.rb → juno/simple_yaml_spec.rb} +0 -0
- data/spec/{simple_yaml_with_expires_spec.rb → juno/simple_yaml_with_expires_spec.rb} +0 -0
- data/spec/{stack_file_memory_spec.rb → juno/stack_file_memory_spec.rb} +0 -0
- data/spec/{stack_memory_file_spec.rb → juno/stack_memory_file_spec.rb} +0 -0
- data/spec/{transformer_bencode_spec.rb → juno/transformer_bencode_spec.rb} +0 -0
- data/spec/{transformer_bert_spec.rb → juno/transformer_bert_spec.rb} +0 -0
- data/spec/{transformer_bson_spec.rb → juno/transformer_bson_spec.rb} +0 -0
- data/spec/{transformer_compress_spec.rb → juno/transformer_compress_spec.rb} +0 -0
- data/spec/{transformer_json_spec.rb → juno/transformer_json_spec.rb} +0 -0
- data/spec/juno/transformer_lzma_spec.rb +22 -0
- data/spec/juno/transformer_lzo_spec.rb +22 -0
- data/spec/{transformer_marshal_base64_spec.rb → juno/transformer_marshal_base64_spec.rb} +0 -0
- data/spec/{transformer_marshal_escape_spec.rb → juno/transformer_marshal_escape_spec.rb} +0 -0
- data/spec/{transformer_marshal_md5_spec.rb → juno/transformer_marshal_md5_spec.rb} +0 -0
- data/spec/{transformer_marshal_md5_spread_spec.rb → juno/transformer_marshal_md5_spread_spec.rb} +0 -0
- data/spec/juno/transformer_marshal_prefix_spec.rb +41 -0
- data/spec/{transformer_marshal_uuencode_spec.rb → juno/transformer_marshal_uuencode_spec.rb} +0 -0
- data/spec/{transformer_msgpack_spec.rb → juno/transformer_msgpack_spec.rb} +0 -0
- data/spec/{transformer_ox_spec.rb → juno/transformer_ox_spec.rb} +0 -0
- data/spec/juno/transformer_quicklz_spec.rb +22 -0
- data/spec/juno/transformer_snappy_spec.rb +22 -0
- data/spec/{transformer_tnet_spec.rb → juno/transformer_tnet_spec.rb} +0 -0
- data/spec/{transformer_yaml_spec.rb → juno/transformer_yaml_spec.rb} +0 -0
- data/spec/rack/cache_juno_spec.rb +355 -0
- data/spec/rack/session_juno_spec.rb +305 -0
- metadata +206 -190
data/.travis.yml
CHANGED
|
@@ -13,7 +13,7 @@ services:
|
|
|
13
13
|
- memcached
|
|
14
14
|
- mongodb
|
|
15
15
|
before_install:
|
|
16
|
-
- sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev
|
|
16
|
+
- sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev liblzo2-dev
|
|
17
17
|
env:
|
|
18
18
|
- "TASK=test:parallel"
|
|
19
19
|
- "TASK=test:non_parallel"
|
|
@@ -23,4 +23,8 @@ matrix:
|
|
|
23
23
|
- rvm: jruby
|
|
24
24
|
- rvm: rbx-18mode
|
|
25
25
|
- rvm: rbx-19mode
|
|
26
|
+
# Parallel tests do not work on jruby
|
|
27
|
+
exclude:
|
|
28
|
+
- rvm: jruby
|
|
29
|
+
env: "TASK=test:parallel"
|
|
26
30
|
script: "bundle exec rake $TASK"
|
data/Gemfile
CHANGED
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
source :rubygems
|
|
2
2
|
gemspec
|
|
3
3
|
|
|
4
|
+
def alternatives(gems)
|
|
5
|
+
if defined?(JRUBY_VERSION)
|
|
6
|
+
[gems[:jruby]].flatten.compact.each {|g| gem g }
|
|
7
|
+
else
|
|
8
|
+
[gems[:mri]].flatten.compact.each {|g| gem g }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
4
12
|
# Testing
|
|
5
13
|
gem 'rake'
|
|
6
14
|
gem 'rspec'
|
|
7
15
|
gem 'parallel_tests'
|
|
8
16
|
|
|
9
|
-
# Serializer
|
|
17
|
+
# Serializer used by Transformer
|
|
10
18
|
gem 'tnetstring'
|
|
11
|
-
gem 'bert'
|
|
12
19
|
gem 'bencode'
|
|
13
|
-
gem 'bson'
|
|
14
20
|
gem 'multi_json'
|
|
21
|
+
alternatives :mri => 'bson_ext', :jruby => 'bson'
|
|
22
|
+
alternatives :mri => 'ox'
|
|
23
|
+
alternatives :mri => 'msgpack', :jruby => 'msgpack-jruby'
|
|
24
|
+
alternatives :mri => 'bert'
|
|
25
|
+
|
|
26
|
+
# Compressors used by Transformer
|
|
27
|
+
alternatives :mri => 'ruby-lzma'
|
|
28
|
+
alternatives :mri => 'qlzruby'
|
|
29
|
+
alternatives :mri => 'lzoruby'
|
|
30
|
+
alternatives :mri => 'snappy'
|
|
15
31
|
|
|
16
32
|
# Backends
|
|
17
33
|
gem 'dm-core'
|
|
@@ -26,23 +42,13 @@ gem 'sequel'
|
|
|
26
42
|
gem 'dalli'
|
|
27
43
|
gem 'riak-client'
|
|
28
44
|
gem 'hashery'
|
|
29
|
-
|
|
30
|
-
if defined?(JRUBY_VERSION)
|
|
31
|
-
gem 'msgpack-jruby'
|
|
32
|
-
gem 'jdbc-sqlite3'
|
|
33
|
-
gem 'activerecord-jdbc-adapter'
|
|
34
|
-
gem 'activerecord-jdbcsqlite3-adapter'
|
|
35
|
-
gem 'jruby-memcached'
|
|
36
|
-
gem 'ffi' # gdbm for jruby needs ffi
|
|
37
|
-
gem 'gdbm'
|
|
38
|
-
else
|
|
39
|
-
gem 'msgpack'
|
|
40
|
-
gem 'tokyocabinet'
|
|
41
|
-
gem 'memcached'
|
|
42
|
-
gem 'sqlite3'
|
|
43
|
-
gem 'ox'
|
|
44
|
-
gem 'bson_ext'
|
|
45
|
-
end
|
|
46
|
-
|
|
47
45
|
#gem 'cassandra'
|
|
48
46
|
#gem 'localmemcache'
|
|
47
|
+
alternatives :mri => 'tokyocabinet'
|
|
48
|
+
alternatives :mri => 'memcached', :jruby => 'jruby-memcached'
|
|
49
|
+
alternatives :mri => 'sqlite3', :jruby => %w(jdbc-sqlite3 activerecord-jdbc-adapter activerecord-jdbcsqlite3-adapter)
|
|
50
|
+
alternatives :jruby => %w(ffi gdbm) # gdbm for jruby needs ffi
|
|
51
|
+
|
|
52
|
+
# Integration
|
|
53
|
+
gem 'rack'
|
|
54
|
+
gem 'rack-cache'
|
data/README.md
CHANGED
|
@@ -13,6 +13,7 @@ Juno is very feature rich:
|
|
|
13
13
|
* Supports proxies (Similar to [Rack middlewares](http://rack.github.com/))
|
|
14
14
|
* Custom serialization via `Juno::Transformer` proxy (Marshal/JSON/YAML and many more)
|
|
15
15
|
* Custom key transformation via `Juno::Transformer` proxy
|
|
16
|
+
* Value compression via `Juno::Transformer` proxy (Zlib, Snappy, QuickLZ, LZO)
|
|
16
17
|
* Expiration for all stores (Added via proxy if not supported natively)
|
|
17
18
|
|
|
18
19
|
Supported backends
|
|
@@ -130,8 +131,8 @@ If you want to have control over the proxies, you have to use `Juno.build`:
|
|
|
130
131
|
store = Juno.build do
|
|
131
132
|
# Adds expires proxy
|
|
132
133
|
use :Expires
|
|
133
|
-
# Transform key and value using Marshal
|
|
134
|
-
use :Transformer, :key => :marshal, :value => :marshal
|
|
134
|
+
# Transform key using Marshal and Base64 and value using Marshal
|
|
135
|
+
use :Transformer, :key => [:marshal, :base64], :value => :marshal
|
|
135
136
|
# Memory backend
|
|
136
137
|
adapter :Memory
|
|
137
138
|
end
|
|
@@ -170,6 +171,44 @@ cache = Juno.build do
|
|
|
170
171
|
end
|
|
171
172
|
~~~
|
|
172
173
|
|
|
174
|
+
Framework Integration
|
|
175
|
+
---------------------
|
|
176
|
+
|
|
177
|
+
Inspired by [redis-store](https://github.com/jodosha/redis-store) there exist integration classes for Rack and Rack-Cache.
|
|
178
|
+
|
|
179
|
+
Use Juno as a Rack session store:
|
|
180
|
+
|
|
181
|
+
~~~ ruby
|
|
182
|
+
require 'rack/session/juno'
|
|
183
|
+
|
|
184
|
+
use Rack::Session::Juno, :store => :Redis
|
|
185
|
+
use Rack::Session::Juno, :store => Juno.new(:Memory, :expires => true)
|
|
186
|
+
|
|
187
|
+
use Rack::Session::Juno do
|
|
188
|
+
use :Expires
|
|
189
|
+
adapter :Memory
|
|
190
|
+
end
|
|
191
|
+
~~~
|
|
192
|
+
|
|
193
|
+
Use Juno as a Rack-Cache store:
|
|
194
|
+
|
|
195
|
+
~~~ ruby
|
|
196
|
+
require 'rack/cache/juno'
|
|
197
|
+
|
|
198
|
+
use Rack::Cache,
|
|
199
|
+
:metastore => 'juno://Memory?expires=true',
|
|
200
|
+
:entitystore => 'juno://Memory?expires=true'
|
|
201
|
+
|
|
202
|
+
# Or used named Juno stores
|
|
203
|
+
Rack::Cache::Juno['named_metastore'] = Juno.build do
|
|
204
|
+
use :Expires
|
|
205
|
+
adapter :Memory
|
|
206
|
+
end
|
|
207
|
+
use Rack::Cache,
|
|
208
|
+
:metastore => 'juno://named_metastore',
|
|
209
|
+
:entity_store => 'juno://named_entitystore'
|
|
210
|
+
~~~
|
|
211
|
+
|
|
173
212
|
Alternatives
|
|
174
213
|
------------
|
|
175
214
|
|
data/Rakefile
CHANGED
|
@@ -14,7 +14,7 @@ namespace :test do
|
|
|
14
14
|
if defined?(JRUBY_VERSION)
|
|
15
15
|
puts 'No tests executed in parallel in JRuby'
|
|
16
16
|
else
|
|
17
|
-
specs = Dir['spec
|
|
17
|
+
specs = Dir['spec/*/*_spec.rb'].reject {|s| s =~ /memcached|redis/ }
|
|
18
18
|
sh("parallel_rspec -m 15 #{specs.join(' ')}")
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -22,9 +22,9 @@ namespace :test do
|
|
|
22
22
|
task :non_parallel do
|
|
23
23
|
if defined?(JRUBY_VERSION)
|
|
24
24
|
# Run all tests in jruby non-parallel
|
|
25
|
-
sh('rspec spec
|
|
25
|
+
sh('rspec spec/*/*_spec.rb')
|
|
26
26
|
else
|
|
27
|
-
specs = Dir['spec
|
|
27
|
+
specs = Dir['spec/*/*_spec.rb'].select {|s| s =~ /memcached|redis/ }
|
|
28
28
|
sh("rspec #{specs.join(' ')}")
|
|
29
29
|
end
|
|
30
30
|
end
|
data/juno.gemspec
CHANGED
|
@@ -3,17 +3,17 @@ require File.dirname(__FILE__) + '/lib/juno/version'
|
|
|
3
3
|
require 'date'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
|
-
s.name
|
|
7
|
-
s.version
|
|
8
|
-
s.date
|
|
9
|
-
s.authors
|
|
10
|
-
s.email
|
|
11
|
-
s.description
|
|
6
|
+
s.name = 'juno'
|
|
7
|
+
s.version = Juno::VERSION
|
|
8
|
+
s.date = Date.today.to_s
|
|
9
|
+
s.authors = ['Daniel Mendler', 'Yehuda Katz', 'Derek Kastner']
|
|
10
|
+
s.email = %w{mail@daniel-mendler.de wycats@gmail.com dkastner@gmail.com}
|
|
11
|
+
s.description = 'A unified interface to key/value stores (moneta replacement)'
|
|
12
12
|
s.extra_rdoc_files = %w{README.md SPEC.md LICENSE}
|
|
13
|
-
s.files
|
|
14
|
-
s.test_files
|
|
15
|
-
s.executables
|
|
16
|
-
s.homepage
|
|
17
|
-
s.require_paths
|
|
18
|
-
s.summary
|
|
13
|
+
s.files = `git ls-files`.split("\n")
|
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
16
|
+
s.homepage = 'http://github.com/minad/juno'
|
|
17
|
+
s.require_paths = ['lib']
|
|
18
|
+
s.summary = %{A unified interface to key/value stores, including MongoDB, Redis, Tokyo, and ActiveRecord}
|
|
19
19
|
end
|
data/lib/juno.rb
CHANGED
|
@@ -70,17 +70,17 @@ module Juno
|
|
|
70
70
|
when :Memcached, :MemcachedDalli, :MemcachedNative
|
|
71
71
|
# Memcached accept only base64 keys, expires already supported
|
|
72
72
|
expires = false
|
|
73
|
-
transformer
|
|
73
|
+
transformer[:key] = [:marshal, :base64]
|
|
74
74
|
when :PStore, :YAML, :DataMapper, :Null
|
|
75
75
|
# For PStore, YAML and DataMapper only the key has to be a string
|
|
76
|
-
transformer
|
|
76
|
+
transformer.delete(:value)
|
|
77
77
|
when :HashFile
|
|
78
78
|
# Use spreading hashes
|
|
79
|
-
transformer
|
|
79
|
+
transformer[:key] = [:marshal, :md5, :spread]
|
|
80
80
|
name = :File
|
|
81
81
|
when :File
|
|
82
82
|
# Use escaping
|
|
83
|
-
transformer
|
|
83
|
+
transformer[:key] = [:marshal, :escape]
|
|
84
84
|
when :Cassandra, :Redis
|
|
85
85
|
# Expires already supported
|
|
86
86
|
expires = false
|
data/lib/juno/adapters/couch.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Juno
|
|
|
21
21
|
# * :repository - Repository name (default :juno)
|
|
22
22
|
# * :table - Table name (default :juno)
|
|
23
23
|
def initialize(options = {})
|
|
24
|
-
raise '
|
|
24
|
+
raise 'Option :setup is required' unless options[:setup]
|
|
25
25
|
@repository = options.delete(:repository) || :juno
|
|
26
26
|
Store.storage_names[@repository] = (options.delete(:table) || :juno).to_s
|
|
27
27
|
::DataMapper.setup(@repository, options[:setup])
|
data/lib/juno/adapters/dbm.rb
CHANGED
data/lib/juno/adapters/file.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Juno
|
|
|
6
6
|
# @api public
|
|
7
7
|
class File < Base
|
|
8
8
|
def initialize(options = {})
|
|
9
|
-
raise '
|
|
9
|
+
raise 'Option :dir is required' unless @dir = options[:dir]
|
|
10
10
|
FileUtils.mkpath(@dir)
|
|
11
11
|
raise "#{@dir} is not a dir" unless ::File.directory?(@dir)
|
|
12
12
|
end
|
data/lib/juno/adapters/fog.rb
CHANGED
|
@@ -13,7 +13,7 @@ module Juno
|
|
|
13
13
|
# * :dir - Fog directory
|
|
14
14
|
# * Other options passed to Fog::Storage#new
|
|
15
15
|
def initialize(options = {})
|
|
16
|
-
raise '
|
|
16
|
+
raise 'Option :dir is required' unless dir = options.delete(:dir)
|
|
17
17
|
storage = ::Fog::Storage.new(options)
|
|
18
18
|
@directory = storage.directories.create(:key => dir)
|
|
19
19
|
end
|
data/lib/juno/adapters/gdbm.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Juno
|
|
|
12
12
|
# Options:
|
|
13
13
|
# * :file - Database file
|
|
14
14
|
def initialize(options = {})
|
|
15
|
-
raise '
|
|
15
|
+
raise 'Option :file is required' unless options[:file]
|
|
16
16
|
@memory = ::LocalMemCache.new(:filename => options[:file])
|
|
17
17
|
end
|
|
18
18
|
|
data/lib/juno/adapters/pstore.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Juno
|
|
|
12
12
|
# Options:
|
|
13
13
|
# * :file - PStore file
|
|
14
14
|
def initialize(options = {})
|
|
15
|
-
raise '
|
|
15
|
+
raise 'Option :file is required' unless options[:file]
|
|
16
16
|
FileUtils.mkpath(::File.dirname(options[:file]))
|
|
17
17
|
@pstore = new_store(options)
|
|
18
18
|
end
|
data/lib/juno/adapters/redis.rb
CHANGED
data/lib/juno/adapters/sdbm.rb
CHANGED
data/lib/juno/adapters/sequel.rb
CHANGED
|
@@ -14,7 +14,7 @@ module Juno
|
|
|
14
14
|
# * :table - Table name (default :juno)
|
|
15
15
|
# * All other options passed to Sequel#connect
|
|
16
16
|
def initialize(options = {})
|
|
17
|
-
raise '
|
|
17
|
+
raise 'Option :db is required' unless db = options.delete(:db)
|
|
18
18
|
@table = options.delete(:table) || :juno
|
|
19
19
|
@db = ::Sequel.connect(db, options)
|
|
20
20
|
@db.create_table?(@table) do
|
data/lib/juno/adapters/sqlite.rb
CHANGED
|
@@ -13,7 +13,7 @@ module Juno
|
|
|
13
13
|
# * :file - Database file
|
|
14
14
|
# * :table - Table name (default juno)
|
|
15
15
|
def initialize(options = {})
|
|
16
|
-
raise '
|
|
16
|
+
raise 'Option :file is required' unless options[:file]
|
|
17
17
|
table = options[:table] || 'juno'
|
|
18
18
|
@db = ::SQLite3::Database.new(options[:file])
|
|
19
19
|
@db.execute("create table if not exists #{table} (k blob not null primary key, v blob)")
|
|
@@ -14,7 +14,7 @@ module Juno
|
|
|
14
14
|
# * :type - Database type (default :hdb, :bdb and :hdb possible)
|
|
15
15
|
def initialize(options = {})
|
|
16
16
|
file = options[:file]
|
|
17
|
-
raise '
|
|
17
|
+
raise 'Option :file is required' unless options[:file]
|
|
18
18
|
if options[:type] == :bdb
|
|
19
19
|
@memory = ::TokyoCabinet::BDB.new
|
|
20
20
|
@memory.open(file, ::TokyoCabinet::BDB::OWRITER | ::TokyoCabinet::BDB::OCREAT)
|
data/lib/juno/builder.rb
CHANGED
|
@@ -2,6 +2,7 @@ module Juno
|
|
|
2
2
|
# Builder implements the DSL to build a chain of store proxies
|
|
3
3
|
# @api private
|
|
4
4
|
class Builder
|
|
5
|
+
# @api private
|
|
5
6
|
def build
|
|
6
7
|
klass, options, block = @proxies.first
|
|
7
8
|
store = klass.new(options, &block)
|
|
@@ -18,12 +19,21 @@ module Juno
|
|
|
18
19
|
instance_eval(&block)
|
|
19
20
|
end
|
|
20
21
|
|
|
22
|
+
# Add proxy to chain
|
|
23
|
+
#
|
|
24
|
+
# @param [Symbol or Class] proxy Name of proxy class or proxy class
|
|
25
|
+
# @param [Hash] options Options hash
|
|
21
26
|
def use(proxy, options = {}, &block)
|
|
22
27
|
proxy = Juno.const_get(proxy) if Symbol === proxy
|
|
23
28
|
raise 'You must give a Class or a Symbol' unless Class === proxy
|
|
24
29
|
@proxies.unshift [proxy, options, block]
|
|
30
|
+
nil
|
|
25
31
|
end
|
|
26
32
|
|
|
33
|
+
# Add adapter to chain
|
|
34
|
+
#
|
|
35
|
+
# @param [Symbol] name Name of adapter class
|
|
36
|
+
# @param [Hash] options Options hash
|
|
27
37
|
def adapter(name, options = {}, &block)
|
|
28
38
|
use(Adapters.const_get(name), options, &block)
|
|
29
39
|
end
|
data/lib/juno/cache.rb
CHANGED
data/lib/juno/expires.rb
CHANGED
data/lib/juno/proxy.rb
CHANGED
data/lib/juno/stack.rb
CHANGED
data/lib/juno/transformer.rb
CHANGED
|
@@ -10,6 +10,7 @@ module Juno
|
|
|
10
10
|
#
|
|
11
11
|
# @api public
|
|
12
12
|
class Transformer < Proxy
|
|
13
|
+
# Available value transformers (Encoding and decoding)
|
|
13
14
|
VALUE_TRANSFORMER = {
|
|
14
15
|
:base64 => { :load => "value.unpack('m').first", :dump => "[value].pack('m').strip" },
|
|
15
16
|
:bencode => { :load => '::BEncode.load(value)', :dump => '::BEncode.dump(value)', :require => 'bencode' },
|
|
@@ -17,14 +18,19 @@ module Juno
|
|
|
17
18
|
:bson => { :load => "::BSON.deserialize(value)['v']", :dump => "::BSON.serialize('v'=>value)", :require => 'bson' },
|
|
18
19
|
:compress => { :load => '::Zlib::Inflate.inflate(value)', :dump => '::Zlib::Deflate.deflate(value)', :require => 'zlib' },
|
|
19
20
|
:json => { :load => '::MultiJson.load(value).first', :dump => '::MultiJson.dump([value])', :require => 'multi_json' },
|
|
21
|
+
:lzma => { :load => '::LZMA.decompress(value)', :dump => '::LZMA.compress(value)', :require => 'lzma' },
|
|
22
|
+
:lzo => { :load => '::LZO.decompress(value)', :dump => '::LZO.compress(value)', :require => 'lzoruby' },
|
|
20
23
|
:marshal => { :load => '::Marshal.load(value)', :dump => '::Marshal.dump(value)' },
|
|
21
24
|
:msgpack => { :load => '::MessagePack.unpack(value)', :dump => '::MessagePack.pack(value)', :require => 'msgpack' },
|
|
22
25
|
:ox => { :load => '::Ox.parse_obj(value)', :dump => '::Ox.dump(value)', :require => 'ox' },
|
|
26
|
+
:snappy => { :load => '::Snappy.inflate(value)', :dump => '::Snappy.deflate(value)', :require => 'snappy' },
|
|
27
|
+
:quicklz => { :load => '::QuickLZ.decompress(value)', :dump => '::QuickLZ.compress(value)', :require => 'qlzruby' },
|
|
23
28
|
:tnet => { :load => '::TNetstring.parse(value).first', :dump => '::TNetstring.dump(value)', :require => 'tnetstring' },
|
|
24
29
|
:uuencode => { :load => "value.unpack('u').first", :dump => "[value].pack('u').strip" },
|
|
25
|
-
:yaml => { :load => '::YAML.load(value)', :dump => '::YAML.dump(value)', :require => 'yaml' }
|
|
30
|
+
:yaml => { :load => '::YAML.load(value)', :dump => '::YAML.dump(value)', :require => 'yaml' },
|
|
26
31
|
}
|
|
27
32
|
|
|
33
|
+
# Available key transformers (Only encoding, one direction)
|
|
28
34
|
KEY_TRANSFORMER = {
|
|
29
35
|
:base64 => { :transform => "[key].pack('m').strip" },
|
|
30
36
|
:bencode => { :transform => '::BEncode.dump(key)', :require => 'bencode' },
|
|
@@ -35,7 +41,8 @@ module Juno
|
|
|
35
41
|
:marshal => { :transform => '(tmp = key; String === tmp ? tmp : ::Marshal.dump(tmp))' },
|
|
36
42
|
:md5 => { :transform => '::Digest::MD5.hexdigest(key)', :require => 'digest/md5' },
|
|
37
43
|
:msgpack => { :transform => '(tmp = key; String === tmp ? tmp : ::MessagePack.pack(tmp))', :require => 'msgpack' },
|
|
38
|
-
:
|
|
44
|
+
:prefix => { :transform => '@prefix+key' },
|
|
45
|
+
:ox => { :transform => '(tmp = key; String === tmp ? tmp : ::Ox.dump(tmp))', :require => 'ox' },
|
|
39
46
|
:spread => { :transform => '(tmp = key; ::File.join(tmp[0..1], tmp[2..-1]))' },
|
|
40
47
|
:tnet => { :transform => '(tmp = key; String === tmp ? tmp : ::TNetstring.dump(tmp))', :require => 'tnetstring' },
|
|
41
48
|
:uuencode => { :transform => "[key].pack('u').strip" },
|
|
@@ -44,9 +51,34 @@ module Juno
|
|
|
44
51
|
|
|
45
52
|
@classes = {}
|
|
46
53
|
|
|
54
|
+
def initialize(adapter, options = {})
|
|
55
|
+
super
|
|
56
|
+
@prefix = options[:prefix]
|
|
57
|
+
end
|
|
58
|
+
|
|
47
59
|
class << self
|
|
48
60
|
alias_method :original_new, :new
|
|
49
61
|
|
|
62
|
+
# Constructor
|
|
63
|
+
#
|
|
64
|
+
# @param [Juno store] adapter The underlying store
|
|
65
|
+
# @param [Hash] options
|
|
66
|
+
#
|
|
67
|
+
# Options:
|
|
68
|
+
# * :key - List of key transformers in the order in which they should be applied
|
|
69
|
+
# * :value - List of value transformers in the order in which they should be applied
|
|
70
|
+
# * :prefix - Prefix string for key namespacing (Used by the :prefix key transformer)
|
|
71
|
+
def new(adapter, options = {})
|
|
72
|
+
keys = [options[:key]].flatten.compact
|
|
73
|
+
values = [options[:value]].flatten.compact
|
|
74
|
+
raise 'Option :key or :value is required' if keys.empty? && values.empty?
|
|
75
|
+
klass = @classes["#{keys.join('-')}+#{values.join('-')}"] ||= compile(keys, values)
|
|
76
|
+
raise 'Option :prefix is required' if keys.include?(:prefix) && !options[:prefix]
|
|
77
|
+
klass.original_new(adapter, options)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
50
82
|
def compile(keys, values)
|
|
51
83
|
tmp, key = 0, 'key'
|
|
52
84
|
keys.each do |tn|
|
|
@@ -101,22 +133,6 @@ module Juno
|
|
|
101
133
|
end
|
|
102
134
|
klass
|
|
103
135
|
end
|
|
104
|
-
|
|
105
|
-
# Constructor
|
|
106
|
-
#
|
|
107
|
-
# @param [Juno store] adapter The underlying store
|
|
108
|
-
# @param [Hash] options
|
|
109
|
-
#
|
|
110
|
-
# Options:
|
|
111
|
-
# * :key - List of key transformers in the order in which they should be applied
|
|
112
|
-
# * :value - List of value transformers in the order in which they should be applied
|
|
113
|
-
def new(adapter, options = {})
|
|
114
|
-
keys = [options[:key]].flatten.compact
|
|
115
|
-
values = [options[:value]].flatten.compact
|
|
116
|
-
raise 'No option :key or :value specified' if keys.empty? && values.empty?
|
|
117
|
-
klass = @classes["#{keys.join('-')}+#{values.join('-')}"] ||= compile(keys, values)
|
|
118
|
-
klass.original_new(adapter, options)
|
|
119
|
-
end
|
|
120
136
|
end
|
|
121
137
|
end
|
|
122
138
|
end
|