moneta 0.7.4 → 0.7.5
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/.gitignore +1 -2
- data/.travis.yml +20 -13
- data/CHANGES +5 -0
- data/Gemfile +24 -25
- data/LICENSE +1 -1
- data/README.md +32 -16
- data/Rakefile +36 -6
- data/lib/moneta/builder.rb +20 -6
- data/lib/moneta/mixins.rb +11 -4
- data/lib/moneta/version.rb +1 -1
- data/script/benchmarks +378 -0
- data/script/{generate-specs.rb → generate-specs} +92 -83
- data/script/install-bundle +26 -0
- data/script/kill-travis +16 -0
- data/script/start-services +8 -0
- data/script/upload-bundle +2 -0
- data/spec/helper.rb +9 -3
- data/spec/moneta/adapter_activerecord_spec.rb +1 -1
- data/spec/moneta/adapter_cassandra_spec.rb +1 -1
- data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +2 -2
- data/spec/moneta/adapter_client_spec.rb +1 -1
- data/spec/moneta/adapter_cookie_spec.rb +2 -2
- data/spec/moneta/adapter_couch_spec.rb +1 -1
- data/spec/moneta/adapter_datamapper_spec.rb +1 -1
- data/spec/moneta/adapter_daybreak_spec.rb +2 -2
- data/spec/moneta/adapter_dbm_spec.rb +1 -1
- data/spec/moneta/adapter_file_spec.rb +1 -1
- data/spec/moneta/adapter_fog_spec.rb +2 -2
- data/spec/moneta/adapter_gdbm_spec.rb +1 -1
- data/spec/moneta/adapter_hbase_spec.rb +1 -1
- data/spec/moneta/adapter_leveldb_spec.rb +1 -1
- data/spec/moneta/adapter_localmemcache_spec.rb +1 -1
- data/spec/moneta/adapter_lruhash_spec.rb +2 -2
- data/spec/moneta/adapter_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_native_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_memory_spec.rb +19 -1
- data/spec/moneta/adapter_mongo_spec.rb +2 -2
- data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_pstore_spec.rb +1 -1
- data/spec/moneta/adapter_redis_spec.rb +1 -1
- data/spec/moneta/adapter_redis_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_restclient_spec.rb +1 -1
- data/spec/moneta/adapter_riak_spec.rb +1 -1
- data/spec/moneta/adapter_sdbm_spec.rb +1 -1
- data/spec/moneta/adapter_sequel_spec.rb +1 -1
- data/spec/moneta/adapter_sqlite_spec.rb +1 -1
- data/spec/moneta/adapter_tdb_spec.rb +1 -1
- data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +1 -1
- data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +1 -1
- data/spec/moneta/adapter_yaml_spec.rb +1 -1
- data/spec/moneta/cache_file_memory_spec.rb +2 -2
- data/spec/moneta/cache_memory_null_spec.rb +2 -2
- data/spec/moneta/expires_file_spec.rb +1 -1
- data/spec/moneta/expires_memory_spec.rb +19 -19
- data/spec/moneta/expires_memory_with_default_expires_spec.rb +19 -19
- data/spec/moneta/lock_spec.rb +19 -1
- data/spec/moneta/null_adapter_spec.rb +1 -1
- data/spec/moneta/optionmerger_spec.rb +14 -1
- data/spec/moneta/pool_spec.rb +1 -1
- data/spec/moneta/proxy_expires_memory_spec.rb +19 -1
- data/spec/moneta/proxy_redis_spec.rb +1 -1
- data/spec/moneta/shared_spec.rb +3 -3
- data/spec/moneta/simple_activerecord_spec.rb +1 -1
- data/spec/moneta/simple_activerecord_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_cassandra_spec.rb +1 -1
- data/spec/moneta/simple_client_tcp_spec.rb +1 -1
- data/spec/moneta/simple_client_unix_spec.rb +1 -1
- data/spec/moneta/simple_couch_spec.rb +1 -1
- data/spec/moneta/simple_couch_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_datamapper_spec.rb +1 -1
- data/spec/moneta/simple_datamapper_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_datamapper_with_repository_spec.rb +1 -1
- data/spec/moneta/simple_daybreak_spec.rb +1 -1
- data/spec/moneta/simple_daybreak_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_dbm_spec.rb +1 -1
- data/spec/moneta/simple_dbm_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_file_spec.rb +1 -1
- data/spec/moneta/simple_file_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_fog_spec.rb +1 -1
- data/spec/moneta/simple_fog_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_gdbm_spec.rb +1 -1
- data/spec/moneta/simple_gdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_hashfile_spec.rb +1 -1
- data/spec/moneta/simple_hashfile_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_hbase_spec.rb +1 -1
- data/spec/moneta/simple_hbase_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_leveldb_spec.rb +1 -1
- data/spec/moneta/simple_leveldb_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_localmemcache_spec.rb +1 -1
- data/spec/moneta/simple_localmemcache_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_lruhash_spec.rb +1 -1
- data/spec/moneta/simple_lruhash_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/simple_memcached_native_spec.rb +1 -1
- data/spec/moneta/simple_memcached_spec.rb +1 -1
- data/spec/moneta/simple_memory_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_compress_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_json_serializer_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_prefix_spec.rb +1 -1
- data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +1 -1
- data/spec/moneta/simple_mongo_spec.rb +1 -1
- data/spec/moneta/simple_null_spec.rb +1 -1
- data/spec/moneta/simple_pstore_spec.rb +1 -1
- data/spec/moneta/simple_pstore_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_redis_spec.rb +1 -1
- data/spec/moneta/simple_restclient_spec.rb +1 -1
- data/spec/moneta/simple_riak_spec.rb +1 -1
- data/spec/moneta/simple_riak_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_sdbm_spec.rb +1 -1
- data/spec/moneta/simple_sdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_sequel_spec.rb +1 -1
- data/spec/moneta/simple_sequel_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_sqlite_spec.rb +1 -1
- data/spec/moneta/simple_sqlite_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_tdb_spec.rb +1 -1
- data/spec/moneta/simple_tdb_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_tokyocabinet_spec.rb +1 -1
- data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +1 -1
- data/spec/moneta/simple_yaml_spec.rb +1 -1
- data/spec/moneta/simple_yaml_with_expires_spec.rb +1 -1
- data/spec/moneta/stack_file_memory_spec.rb +2 -2
- data/spec/moneta/stack_memory_file_spec.rb +3 -3
- data/spec/moneta/transformer_bencode_spec.rb +1 -1
- data/spec/moneta/transformer_bert_spec.rb +1 -1
- data/spec/moneta/transformer_bson_spec.rb +1 -1
- data/spec/moneta/transformer_bzip2_spec.rb +1 -1
- data/spec/moneta/transformer_json_spec.rb +1 -1
- data/spec/moneta/transformer_key_marshal_spec.rb +19 -19
- data/spec/moneta/transformer_key_yaml_spec.rb +19 -19
- data/spec/moneta/transformer_lzma_spec.rb +1 -1
- data/spec/moneta/transformer_lzo_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_base64_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_escape_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_hmac_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_md5_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_md5_spread_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_prefix_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_rmd160_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha1_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha256_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha384_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha512_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_truncate_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_uuencode_spec.rb +1 -1
- data/spec/moneta/transformer_msgpack_spec.rb +1 -1
- data/spec/moneta/transformer_ox_spec.rb +1 -1
- data/spec/moneta/transformer_quicklz_spec.rb +1 -1
- data/spec/moneta/transformer_snappy_spec.rb +1 -1
- data/spec/moneta/transformer_tnet_spec.rb +1 -1
- data/spec/moneta/transformer_value_marshal_spec.rb +1 -1
- data/spec/moneta/transformer_value_yaml_spec.rb +1 -1
- data/spec/moneta/transformer_yaml_spec.rb +1 -1
- data/spec/moneta/transformer_zlib_spec.rb +1 -1
- data/spec/monetaspecs.rb +655 -151
- metadata +8 -6
- data/benchmarks/run.rb +0 -327
- data/script/install-bundle.rb +0 -35
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
|
@@ -1,25 +1,28 @@
|
|
|
1
|
+
language: ruby
|
|
1
2
|
rvm:
|
|
2
3
|
- 1.8.7
|
|
3
4
|
- 1.9.3
|
|
4
|
-
- jruby
|
|
5
|
+
- jruby-18mode
|
|
6
|
+
- jruby-19mode
|
|
5
7
|
- rbx-18mode
|
|
6
8
|
- rbx-19mode
|
|
7
|
-
services:
|
|
8
|
-
- riak
|
|
9
|
-
- couchdb
|
|
10
|
-
- redis-server
|
|
11
|
-
- cassandra
|
|
12
|
-
- memcached
|
|
13
|
-
- mongodb
|
|
14
9
|
before_install:
|
|
10
|
+
- script/kill-travis
|
|
11
|
+
- script/start-services
|
|
15
12
|
- sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev liblzo2-dev libtdb-dev
|
|
16
|
-
- script/install-bundle
|
|
13
|
+
- script/install-bundle
|
|
14
|
+
- script/upload-bundle
|
|
15
|
+
install: 'echo "Bundle installed"'
|
|
17
16
|
env:
|
|
18
17
|
global:
|
|
19
|
-
- secure: "
|
|
20
|
-
- secure: "Pv/MUnoaZMbPNB3vx4Hw2ASQBsUO7HIjJsfGHAQa5VbWlX3qEfMdezlYzNbf\nDPdpeabQwEwCUcINT7x10XKH5M4nZn6bBGfpvmNMxvZ8De1Et7mrwvb5/o73\n5EkyvYuUu8FB/LQmjB/4zZcjLQWNCtcfPlYPs7YcADBt0gIwn8M="
|
|
18
|
+
- secure: "B0vx1g1CB1A6mM3B/iy2ATicfS4OXT80bb2RVe8mSRsPzez1B4q4Q4hJcaMI\nrMARONN8Krtnti+IqvmDnB0Z0AKYMEyIc+zT37zJOCjLdkLJl+x/thuU/MbC\nvlLVwjMf6JE2EUzTfORDRFYc5ycCqfsfgNk1Go0D2CPT6P9u9uQ="
|
|
21
19
|
matrix:
|
|
22
|
-
- "TASK=test"
|
|
20
|
+
- "TASK=test TEST_GROUP=1/5"
|
|
21
|
+
- "TASK=test TEST_GROUP=2/5"
|
|
22
|
+
- "TASK=test TEST_GROUP=3/5"
|
|
23
|
+
- "TASK=test TEST_GROUP=4/5"
|
|
24
|
+
- "TASK=test TEST_GROUP=5/5"
|
|
25
|
+
- "TASK=test TEST_GROUP=unstable"
|
|
23
26
|
- "TASK=benchmarks CONFIG=uniform_small"
|
|
24
27
|
- "TASK=benchmarks CONFIG=uniform_medium"
|
|
25
28
|
- "TASK=benchmarks CONFIG=uniform_large"
|
|
@@ -28,9 +31,13 @@ env:
|
|
|
28
31
|
- "TASK=benchmarks CONFIG=normal_large"
|
|
29
32
|
matrix:
|
|
30
33
|
allow_failures:
|
|
31
|
-
- rvm: jruby
|
|
34
|
+
- rvm: jruby-18mode
|
|
35
|
+
- rvm: jruby-19mode
|
|
32
36
|
- rvm: rbx-18mode
|
|
33
37
|
- rvm: rbx-19mode
|
|
38
|
+
- env:
|
|
39
|
+
- "TASK=test TEST_GROUP=unstable"
|
|
40
|
+
- secure: "B0vx1g1CB1A6mM3B/iy2ATicfS4OXT80bb2RVe8mSRsPzez1B4q4Q4hJcaMI\nrMARONN8Krtnti+IqvmDnB0Z0AKYMEyIc+zT37zJOCjLdkLJl+x/thuU/MbC\nvlLVwjMf6JE2EUzTfORDRFYc5ycCqfsfgNk1Go0D2CPT6P9u9uQ="
|
|
34
41
|
script: "bundle exec rake $TASK"
|
|
35
42
|
branches:
|
|
36
43
|
only:
|
data/CHANGES
CHANGED
data/Gemfile
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
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
|
-
|
|
12
4
|
# Testing
|
|
13
5
|
gem 'rake'
|
|
14
6
|
gem 'rspec'
|
|
@@ -17,21 +9,22 @@ gem 'rspec'
|
|
|
17
9
|
gem 'tnetstring'
|
|
18
10
|
gem 'bencode'
|
|
19
11
|
gem 'multi_json'
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
gem 'bson_ext', :platforms => :ruby
|
|
13
|
+
gem 'bson', :platforms => :jruby
|
|
14
|
+
gem 'ox', :platforms => :ruby
|
|
15
|
+
gem 'msgpack', :platforms => :ruby
|
|
16
|
+
gem 'msgpack-jruby', :platforms => :jruby
|
|
17
|
+
gem 'bert', :platforms => :ruby
|
|
24
18
|
|
|
25
19
|
# Compressors used by Transformer
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
alternatives :mri => 'qlzruby'
|
|
20
|
+
gem 'bzip2-ruby', :platforms => :mri # Only on mri currently
|
|
21
|
+
gem 'ruby-lzma', :platforms => :ruby
|
|
22
|
+
gem 'lzoruby', :platforms => :ruby
|
|
23
|
+
gem 'snappy', :platforms => :ruby
|
|
24
|
+
gem 'qlzruby', :platforms => :ruby
|
|
32
25
|
|
|
33
26
|
# Backends
|
|
34
|
-
gem 'daybreak'
|
|
27
|
+
gem 'daybreak'
|
|
35
28
|
gem 'dm-core'
|
|
36
29
|
gem 'dm-migrations'
|
|
37
30
|
gem 'dm-sqlite-adapter'
|
|
@@ -46,12 +39,18 @@ gem 'riak-client'
|
|
|
46
39
|
gem 'cassandra'
|
|
47
40
|
#gem 'hbaserb'
|
|
48
41
|
#gem 'localmemcache'
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
42
|
+
gem 'tdb', :platforms => :ruby
|
|
43
|
+
gem 'leveldb-ruby', :platforms => :ruby
|
|
44
|
+
gem 'tokyocabinet', :platforms => :ruby
|
|
45
|
+
gem 'memcached', :platforms => :ruby
|
|
46
|
+
gem 'jruby-memcached', :platforms => :jruby
|
|
47
|
+
gem 'sqlite3', :platforms => :ruby
|
|
48
|
+
gem 'jdbc-sqlite3', :platforms => :jruby
|
|
49
|
+
gem 'activerecord-jdbc-adapter', :platforms => :jruby
|
|
50
|
+
gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby
|
|
51
|
+
# gdbm for jruby needs ffi
|
|
52
|
+
gem 'ffi', :platforms => :jruby
|
|
53
|
+
gem 'gdbm', :platforms => :jruby
|
|
55
54
|
|
|
56
55
|
# Rack integration testing
|
|
57
56
|
gem 'rack'
|
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -43,7 +43,6 @@ Out of the box, it supports the following backends:
|
|
|
43
43
|
* LRU hash - prefer this over :Memory! (`:LRUHash`)
|
|
44
44
|
* LocalMemCache (`:LocalMemCache`)
|
|
45
45
|
* Memcached store (`:Memcached`, `:MemcachedNative` and `:MemcachedDalli`)
|
|
46
|
-
* Daybreak database (`:Daybreak`)
|
|
47
46
|
* Relational Databases:
|
|
48
47
|
* DataMapper (`:DataMapper`)
|
|
49
48
|
* ActiveRecord (`:ActiveRecord`)
|
|
@@ -86,20 +85,20 @@ to upgrade to a real key/value store.
|
|
|
86
85
|
<table>
|
|
87
86
|
<thead style="font-weight:bold"><tr><th>Adapter</th><th>Required gems</th><th>Multi-thread safe<sup>[1]</sup></th><th>Multi-process safe<sup>[2]</sup></th><th>Atomic increment</th><th>Native expires<sup>[3]</sup></th><th>Persistent</th><th>Description</th></tr></thead>
|
|
88
87
|
<tbody>
|
|
89
|
-
<tr><td>ActiveRecord</td><td>activerecord</td><td style="color:
|
|
88
|
+
<tr><td>ActiveRecord</td><td>activerecord</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>ActiveRecord ORM</td></tr>
|
|
90
89
|
<tr><td>Cassandra</td><td>cassandra</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:green">✓</td><td>Cassandra distributed database</td></tr>
|
|
91
90
|
<tr><td>Client</td><td>-</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:blue">?<sup>[5]</sup></td><td style="color:blue">?<sup>[5]</sup></td><td style="color:blue">?<sup>[5]</sup></td><td>Moneta client adapter</td></tr>
|
|
92
91
|
<tr><td>Cookie</td><td>-</td><td style="color:red">✗</td><td style="color:blue">(✓)<sup>[6]</sup></td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td>Cookie in memory store</td></tr>
|
|
93
92
|
<tr><td>Couch</td><td>couchrest</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>CouchDB database</td></tr>
|
|
94
93
|
<tr><td>DataMapper</td><td>dm-core, dm-migrations</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>DataMapper ORM</td></tr>
|
|
95
|
-
<tr><td>Daybreak</td><td>daybreak</td><td style="color:
|
|
94
|
+
<tr><td>Daybreak</td><td>daybreak</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Daybreak ruby key/value store</td></tr>
|
|
96
95
|
<tr><td>DBM</td><td>-</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Berkeley DB</td></tr>
|
|
97
96
|
<tr><td>File</td><td>-</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>File store</td></tr>
|
|
98
97
|
<tr><td>Fog</td><td>fog</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Fog cloud store</td></tr>
|
|
99
98
|
<tr><td>GDBM</td><td>-</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>GDBM database</td></tr>
|
|
100
99
|
<tr><td>HBase</td><td>hbase</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>HBase database</td></tr>
|
|
101
100
|
<tr><td>LevelDB</td><td>leveldb</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>LevelDB database</td></tr>
|
|
102
|
-
<tr><td>LocalMemCache</td><td>localmemcache</td><td style="color:
|
|
101
|
+
<tr><td>LocalMemCache</td><td>localmemcache</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>LocalMemCache database</td></tr>
|
|
103
102
|
<tr><td>LRUHash</td><td>-</td><td style="color:red">✗</td><td style="color:blue">(✓)<sup>[6]</sup></td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td>LRU memory store</td></tr>
|
|
104
103
|
<tr><td>Memcached</td><td>dalli or memcached</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗<sup>[4]</sup></td><td>Memcached database</td></tr>
|
|
105
104
|
<tr><td>MemcachedDalli</td><td>dalli</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗<sup>[4]</sup></td><td>Memcached database</td></tr>
|
|
@@ -110,7 +109,7 @@ to upgrade to a real key/value store.
|
|
|
110
109
|
<tr><td>PStore</td><td>-</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>PStore store</td></tr>
|
|
111
110
|
<tr><td>Redis</td><td>redis</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td>Redis database</td></tr>
|
|
112
111
|
<tr><td>RestClient</td><td>-</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:blue">?<sup>[5]</sup></td><td>Moneta REST client adapter</td></tr>
|
|
113
|
-
<tr><td>Riak</td><td>riak-client</td><td style="color:
|
|
112
|
+
<tr><td>Riak</td><td>riak-client</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Riak database</td></tr>
|
|
114
113
|
<tr><td>SDBM</td><td>-</td><td style="color:red">✗</td><td style="color:red">✗</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>SDBM database</td></tr>
|
|
115
114
|
<tr><td>Sequel</td><td>sequel</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Sequel ORM</td></tr>
|
|
116
115
|
<tr><td>Sqlite</td><td>sqlite3</td><td style="color:blue">?</td><td style="color:green">✓</td><td style="color:green">✓</td><td style="color:red">✗</td><td style="color:green">✓</td><td>Sqlite3 database</td></tr>
|
|
@@ -120,7 +119,7 @@ to upgrade to a real key/value store.
|
|
|
120
119
|
</tbody>
|
|
121
120
|
</table>
|
|
122
121
|
|
|
123
|
-
* [1]: Make adapters thread-safe by using `Moneta::Lock
|
|
122
|
+
* [1]: Make adapters thread-safe by using `Moneta::Lock` or by passing the option `:threadsafe => true` to `Moneta#new`. There is also `Moneta::Pool` which can be used to share a store between multiple threads if the store is multi-process safe.
|
|
124
123
|
* [2]: Share a Moneta store between multiple processes using `Moneta::Shared` (See below).
|
|
125
124
|
* [3]: Add expiration support by using `Moneta::Expires` or by passing the option `:expires => true` to `Moneta#new`.
|
|
126
125
|
* [4]: There are some servers which use the memcached protocol but which are persistent (e.g. MemcacheDB, Kai, IronCache, ...)
|
|
@@ -232,7 +231,7 @@ end
|
|
|
232
231
|
|
|
233
232
|
### Expiration
|
|
234
233
|
|
|
235
|
-
The Cassandra, Memcached, Redis and Mongo backends
|
|
234
|
+
The Cassandra, Memcached, Redis and Mongo backends support expiration natively.
|
|
236
235
|
|
|
237
236
|
~~~ ruby
|
|
238
237
|
cache = Moneta::Adapters::Memcached.new
|
|
@@ -352,11 +351,24 @@ short_lived_store = store.expires(60)
|
|
|
352
351
|
short_lived_store['key'] = 'value'
|
|
353
352
|
~~~
|
|
354
353
|
|
|
354
|
+
### Add proxies to existing store
|
|
355
|
+
|
|
356
|
+
You can add proxies to an existing store. This is useful if you want to compress only a few values for example.
|
|
357
|
+
|
|
358
|
+
~~~ ruby
|
|
359
|
+
compressed_store = store.with(:prefix => 'compressed') do
|
|
360
|
+
use :Transformer, :value => :zlib
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
store['key'] = 'this value will not be compressed'
|
|
364
|
+
compressed_store['key'] = 'value will be compressed'
|
|
365
|
+
~~~
|
|
366
|
+
|
|
355
367
|
## Framework Integration
|
|
356
368
|
|
|
357
|
-
Inspired by [redis-store](https://github.com/jodosha/redis-store) there exist integration classes for [Rails](http://rubyonrails.org/), [Rack](http://rack.github.com/) and [Rack-Cache](https://github.com/rtomayko/rack-cache). You can also use all the Rack middlewares together with the [Sinatra](http://sinatrarb.com/) framework. There exist the following integration classes:
|
|
369
|
+
Inspired by [redis-store](https://github.com/jodosha/redis-store) there exist integration classes for [Rails](http://rubyonrails.org/), [Rack](http://rack.github.com/) and [Rack-Cache](https://github.com/rtomayko/rack-cache). You can also use all the Rack middlewares together with Rails and the [Sinatra](http://sinatrarb.com/) framework. There exist the following integration classes:
|
|
358
370
|
|
|
359
|
-
* Rack and Sinatra
|
|
371
|
+
* Rack, Rails and Sinatra
|
|
360
372
|
* `Rack::Session::Moneta` is a Rack middleware to use Moneta for storing sessions
|
|
361
373
|
* `Rack::MonetaStore` is a Rack middleware which places a Moneta store in the environment and enables per-request caching
|
|
362
374
|
* `Rack::MonetaCookies` is a Rack middleware which uses Moneta to store cookies
|
|
@@ -366,7 +378,9 @@ Inspired by [redis-store](https://github.com/jodosha/redis-store) there exist in
|
|
|
366
378
|
* `ActionDispatch::Session::MonetaStore` is a Rails middleware to use Moneta for storing sessions
|
|
367
379
|
* `ActiveSupport::Cache::MonetaStore` is a Rails cache implementation which uses a Moneta store as backend
|
|
368
380
|
|
|
369
|
-
### Rack
|
|
381
|
+
### Rack
|
|
382
|
+
|
|
383
|
+
#### Session store
|
|
370
384
|
|
|
371
385
|
You can use Moneta as a [Rack](http://rack.github.com/) session store. Use it in your `config.ru` like this:
|
|
372
386
|
|
|
@@ -386,7 +400,7 @@ use Rack::Session::Moneta do
|
|
|
386
400
|
end
|
|
387
401
|
~~~
|
|
388
402
|
|
|
389
|
-
|
|
403
|
+
#### Moneta middleware
|
|
390
404
|
|
|
391
405
|
There is a simple middleware which places a Moneta store in the Rack environment at `env['rack.moneta_store']`. It supports per-request
|
|
392
406
|
caching if you add the option `:cache => true`. Use it in your `config.ru` like this:
|
|
@@ -410,7 +424,7 @@ run lambda do |env|
|
|
|
410
424
|
end
|
|
411
425
|
~~~
|
|
412
426
|
|
|
413
|
-
|
|
427
|
+
#### REST server
|
|
414
428
|
|
|
415
429
|
If you want to expose your Moneta key/value store via HTTP, you can use the Rack/Moneta REST service. Use it in your `config.ru` like this:
|
|
416
430
|
|
|
@@ -428,7 +442,7 @@ run Rack::MonetaRest.new do
|
|
|
428
442
|
end
|
|
429
443
|
~~~
|
|
430
444
|
|
|
431
|
-
|
|
445
|
+
#### Rack-Cache
|
|
432
446
|
|
|
433
447
|
You can use Moneta as a [Rack-Cache](https://github.com/rtomayko/rack-cache) store. Use it in your `config.ru` like this:
|
|
434
448
|
|
|
@@ -449,7 +463,7 @@ use Rack::Cache,
|
|
|
449
463
|
:entity_store => 'moneta://named_entitystore'
|
|
450
464
|
~~~
|
|
451
465
|
|
|
452
|
-
|
|
466
|
+
#### Cookies
|
|
453
467
|
|
|
454
468
|
Use Moneta to store cookies in [Rack](http://rack.github.com/). It uses the `Moneta::Adapters::Cookie`. You might
|
|
455
469
|
wonder what the purpose of this store or Rack middleware is: It makes it possible
|
|
@@ -470,7 +484,9 @@ run lambda do |env|
|
|
|
470
484
|
end
|
|
471
485
|
~~~
|
|
472
486
|
|
|
473
|
-
### Rails
|
|
487
|
+
### Rails
|
|
488
|
+
|
|
489
|
+
#### Session store
|
|
474
490
|
|
|
475
491
|
Add the session store in your application configuration `config/environments/*.rb`.
|
|
476
492
|
|
|
@@ -490,7 +506,7 @@ config.cache_store :moneta_store, :store => Moneta.build do
|
|
|
490
506
|
end
|
|
491
507
|
~~~
|
|
492
508
|
|
|
493
|
-
|
|
509
|
+
#### Cache store
|
|
494
510
|
|
|
495
511
|
Add the cache store in your application configuration `config/environments/*.rb`. Unfortunately the
|
|
496
512
|
Moneta cache store doesn't support matchers. If you need these features use a different server-specific implementation.
|
data/Rakefile
CHANGED
|
@@ -16,11 +16,42 @@ rescue Exception => ex
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
task :test do
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
specs = Dir['spec/*/*_spec.rb'].sort
|
|
20
|
+
|
|
21
|
+
# FIXME:
|
|
22
|
+
#
|
|
23
|
+
# * QuickLZ segfaults because of an assertion
|
|
24
|
+
# QuickLZ is also not maintained on Github, but on Bitbucket
|
|
25
|
+
# and I don't know where the issue tracker is.
|
|
26
|
+
#
|
|
27
|
+
# * Daybreak leads to a segfault
|
|
28
|
+
#
|
|
29
|
+
# * Cassandra and Mongo show spurious failures
|
|
30
|
+
if ENV['TEST_GROUP']
|
|
31
|
+
unstable = specs.select {|s| s =~ /quicklz|cassandra|mongo|daybreak/ }
|
|
32
|
+
specs -= unstable
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Memcached and Redis specs cannot be used in parallel
|
|
36
|
+
# because of flushing and lacking namespaces
|
|
22
37
|
parallel = specs.reject {|s| s =~ /memcached|redis|client|shared|riak/ }
|
|
23
38
|
serial = specs - parallel
|
|
39
|
+
|
|
40
|
+
if ENV['TEST_GROUP'] =~ /^(\d+)\/(\d+)$/
|
|
41
|
+
n = $1.to_i
|
|
42
|
+
max = $2.to_i
|
|
43
|
+
if n == max
|
|
44
|
+
parallel = parallel[(n-1)*(parallel.size/max)..-1]
|
|
45
|
+
serial = serial[(n-1)*(serial.size/max)..-1]
|
|
46
|
+
else
|
|
47
|
+
parallel = parallel[(n-1)*(parallel.size/max), parallel.size/max]
|
|
48
|
+
serial = serial[(n-1)*(serial.size/max), serial.size/max]
|
|
49
|
+
end
|
|
50
|
+
elsif ENV['TEST_GROUP'] == 'unstable'
|
|
51
|
+
parallel.clear
|
|
52
|
+
serial = unstable
|
|
53
|
+
end
|
|
54
|
+
|
|
24
55
|
threads = []
|
|
25
56
|
failed = false
|
|
26
57
|
parallel.each do |spec|
|
|
@@ -32,7 +63,7 @@ task :test do
|
|
|
32
63
|
end
|
|
33
64
|
end
|
|
34
65
|
sleep 0.1
|
|
35
|
-
sleep 0.1 while threads.size >=
|
|
66
|
+
sleep 0.1 while threads.size >= 10
|
|
36
67
|
end
|
|
37
68
|
sleep 0.1 until threads.empty?
|
|
38
69
|
serial.each do |spec|
|
|
@@ -46,8 +77,7 @@ task :test do
|
|
|
46
77
|
end
|
|
47
78
|
|
|
48
79
|
task :benchmarks do
|
|
49
|
-
|
|
50
|
-
ruby("run.rb #{ENV['CONFIG']}")
|
|
80
|
+
ruby("script/benchmarks #{ENV['CONFIG']}")
|
|
51
81
|
end
|
|
52
82
|
|
|
53
83
|
task :default => :test
|
data/lib/moneta/builder.rb
CHANGED
|
@@ -14,8 +14,12 @@ module Moneta
|
|
|
14
14
|
# @return [Object] Generated Moneta proxy stack
|
|
15
15
|
# @api public
|
|
16
16
|
def build
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
adapter = @proxies.first
|
|
18
|
+
if Array === adapter
|
|
19
|
+
klass, options, block = adapter
|
|
20
|
+
adapter = klass.new(options, &block)
|
|
21
|
+
end
|
|
22
|
+
@proxies[1..-1].inject([adapter]) do |stores, proxy|
|
|
19
23
|
klass, options, block = proxy
|
|
20
24
|
stores << klass.new(stores.last, options, &block)
|
|
21
25
|
end
|
|
@@ -23,7 +27,7 @@ module Moneta
|
|
|
23
27
|
|
|
24
28
|
# Add proxy to stack
|
|
25
29
|
#
|
|
26
|
-
# @param [Symbol
|
|
30
|
+
# @param [Symbol/Class] proxy Name of proxy class or proxy class
|
|
27
31
|
# @param [Hash] options Options hash
|
|
28
32
|
# @api public
|
|
29
33
|
def use(proxy, options = {}, &block)
|
|
@@ -35,11 +39,21 @@ module Moneta
|
|
|
35
39
|
|
|
36
40
|
# Add adapter to stack
|
|
37
41
|
#
|
|
38
|
-
# @param [Symbol]
|
|
42
|
+
# @param [Symbol/Class/Moneta store] adapter Name of adapter class, adapter class or Moneta store
|
|
39
43
|
# @param [Hash] options Options hash
|
|
40
44
|
# @api public
|
|
41
|
-
def adapter(
|
|
42
|
-
|
|
45
|
+
def adapter(adapter, options = {}, &block)
|
|
46
|
+
case adapter
|
|
47
|
+
when Symbol
|
|
48
|
+
use(Adapters.const_get(adapter), options, &block)
|
|
49
|
+
when Class
|
|
50
|
+
use(adapter, options, &block)
|
|
51
|
+
else
|
|
52
|
+
raise ArgumentError, 'Adapter must be a Moneta store' unless adapter.respond_to?(:load) && adapter.respond_to?(:store)
|
|
53
|
+
raise ArgumentError, 'No options allowed' unless options.empty?
|
|
54
|
+
@proxies.unshift adapter
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
43
57
|
end
|
|
44
58
|
end
|
|
45
59
|
end
|
data/lib/moneta/mixins.rb
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
module Moneta
|
|
2
2
|
# @api private
|
|
3
3
|
module OptionSupport
|
|
4
|
-
# Return Moneta store with default options
|
|
4
|
+
# Return Moneta store with default options or additional proxies
|
|
5
5
|
#
|
|
6
6
|
# @param [Hash] options Options to merge
|
|
7
|
-
# @return [
|
|
7
|
+
# @return [Moneta store]
|
|
8
|
+
#
|
|
8
9
|
# @api public
|
|
9
|
-
def with(options)
|
|
10
|
-
|
|
10
|
+
def with(options = nil, &block)
|
|
11
|
+
adapter = self
|
|
12
|
+
if block
|
|
13
|
+
builder = Builder.new(&block)
|
|
14
|
+
builder.adapter(adapter)
|
|
15
|
+
adapter = builder.build.last
|
|
16
|
+
end
|
|
17
|
+
options ? OptionMerger.new(adapter, options) : adapter
|
|
11
18
|
end
|
|
12
19
|
|
|
13
20
|
# Return Moneta store with default option :raw => true
|
data/lib/moneta/version.rb
CHANGED