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.
Files changed (165) hide show
  1. data/.gitignore +1 -2
  2. data/.travis.yml +20 -13
  3. data/CHANGES +5 -0
  4. data/Gemfile +24 -25
  5. data/LICENSE +1 -1
  6. data/README.md +32 -16
  7. data/Rakefile +36 -6
  8. data/lib/moneta/builder.rb +20 -6
  9. data/lib/moneta/mixins.rb +11 -4
  10. data/lib/moneta/version.rb +1 -1
  11. data/script/benchmarks +378 -0
  12. data/script/{generate-specs.rb → generate-specs} +92 -83
  13. data/script/install-bundle +26 -0
  14. data/script/kill-travis +16 -0
  15. data/script/start-services +8 -0
  16. data/script/upload-bundle +2 -0
  17. data/spec/helper.rb +9 -3
  18. data/spec/moneta/adapter_activerecord_spec.rb +1 -1
  19. data/spec/moneta/adapter_cassandra_spec.rb +1 -1
  20. data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +2 -2
  21. data/spec/moneta/adapter_client_spec.rb +1 -1
  22. data/spec/moneta/adapter_cookie_spec.rb +2 -2
  23. data/spec/moneta/adapter_couch_spec.rb +1 -1
  24. data/spec/moneta/adapter_datamapper_spec.rb +1 -1
  25. data/spec/moneta/adapter_daybreak_spec.rb +2 -2
  26. data/spec/moneta/adapter_dbm_spec.rb +1 -1
  27. data/spec/moneta/adapter_file_spec.rb +1 -1
  28. data/spec/moneta/adapter_fog_spec.rb +2 -2
  29. data/spec/moneta/adapter_gdbm_spec.rb +1 -1
  30. data/spec/moneta/adapter_hbase_spec.rb +1 -1
  31. data/spec/moneta/adapter_leveldb_spec.rb +1 -1
  32. data/spec/moneta/adapter_localmemcache_spec.rb +1 -1
  33. data/spec/moneta/adapter_lruhash_spec.rb +2 -2
  34. data/spec/moneta/adapter_memcached_dalli_spec.rb +1 -1
  35. data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
  36. data/spec/moneta/adapter_memcached_native_spec.rb +1 -1
  37. data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +1 -1
  38. data/spec/moneta/adapter_memcached_spec.rb +1 -1
  39. data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +1 -1
  40. data/spec/moneta/adapter_memory_spec.rb +19 -1
  41. data/spec/moneta/adapter_mongo_spec.rb +2 -2
  42. data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +1 -1
  43. data/spec/moneta/adapter_pstore_spec.rb +1 -1
  44. data/spec/moneta/adapter_redis_spec.rb +1 -1
  45. data/spec/moneta/adapter_redis_with_default_expires_spec.rb +1 -1
  46. data/spec/moneta/adapter_restclient_spec.rb +1 -1
  47. data/spec/moneta/adapter_riak_spec.rb +1 -1
  48. data/spec/moneta/adapter_sdbm_spec.rb +1 -1
  49. data/spec/moneta/adapter_sequel_spec.rb +1 -1
  50. data/spec/moneta/adapter_sqlite_spec.rb +1 -1
  51. data/spec/moneta/adapter_tdb_spec.rb +1 -1
  52. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +1 -1
  53. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +1 -1
  54. data/spec/moneta/adapter_yaml_spec.rb +1 -1
  55. data/spec/moneta/cache_file_memory_spec.rb +2 -2
  56. data/spec/moneta/cache_memory_null_spec.rb +2 -2
  57. data/spec/moneta/expires_file_spec.rb +1 -1
  58. data/spec/moneta/expires_memory_spec.rb +19 -19
  59. data/spec/moneta/expires_memory_with_default_expires_spec.rb +19 -19
  60. data/spec/moneta/lock_spec.rb +19 -1
  61. data/spec/moneta/null_adapter_spec.rb +1 -1
  62. data/spec/moneta/optionmerger_spec.rb +14 -1
  63. data/spec/moneta/pool_spec.rb +1 -1
  64. data/spec/moneta/proxy_expires_memory_spec.rb +19 -1
  65. data/spec/moneta/proxy_redis_spec.rb +1 -1
  66. data/spec/moneta/shared_spec.rb +3 -3
  67. data/spec/moneta/simple_activerecord_spec.rb +1 -1
  68. data/spec/moneta/simple_activerecord_with_expires_spec.rb +1 -1
  69. data/spec/moneta/simple_cassandra_spec.rb +1 -1
  70. data/spec/moneta/simple_client_tcp_spec.rb +1 -1
  71. data/spec/moneta/simple_client_unix_spec.rb +1 -1
  72. data/spec/moneta/simple_couch_spec.rb +1 -1
  73. data/spec/moneta/simple_couch_with_expires_spec.rb +1 -1
  74. data/spec/moneta/simple_datamapper_spec.rb +1 -1
  75. data/spec/moneta/simple_datamapper_with_expires_spec.rb +1 -1
  76. data/spec/moneta/simple_datamapper_with_repository_spec.rb +1 -1
  77. data/spec/moneta/simple_daybreak_spec.rb +1 -1
  78. data/spec/moneta/simple_daybreak_with_expires_spec.rb +1 -1
  79. data/spec/moneta/simple_dbm_spec.rb +1 -1
  80. data/spec/moneta/simple_dbm_with_expires_spec.rb +1 -1
  81. data/spec/moneta/simple_file_spec.rb +1 -1
  82. data/spec/moneta/simple_file_with_expires_spec.rb +1 -1
  83. data/spec/moneta/simple_fog_spec.rb +1 -1
  84. data/spec/moneta/simple_fog_with_expires_spec.rb +1 -1
  85. data/spec/moneta/simple_gdbm_spec.rb +1 -1
  86. data/spec/moneta/simple_gdbm_with_expires_spec.rb +1 -1
  87. data/spec/moneta/simple_hashfile_spec.rb +1 -1
  88. data/spec/moneta/simple_hashfile_with_expires_spec.rb +1 -1
  89. data/spec/moneta/simple_hbase_spec.rb +1 -1
  90. data/spec/moneta/simple_hbase_with_expires_spec.rb +1 -1
  91. data/spec/moneta/simple_leveldb_spec.rb +1 -1
  92. data/spec/moneta/simple_leveldb_with_expires_spec.rb +1 -1
  93. data/spec/moneta/simple_localmemcache_spec.rb +1 -1
  94. data/spec/moneta/simple_localmemcache_with_expires_spec.rb +1 -1
  95. data/spec/moneta/simple_lruhash_spec.rb +1 -1
  96. data/spec/moneta/simple_lruhash_with_expires_spec.rb +1 -1
  97. data/spec/moneta/simple_memcached_dalli_spec.rb +1 -1
  98. data/spec/moneta/simple_memcached_native_spec.rb +1 -1
  99. data/spec/moneta/simple_memcached_spec.rb +1 -1
  100. data/spec/moneta/simple_memory_spec.rb +1 -1
  101. data/spec/moneta/simple_memory_with_compress_spec.rb +1 -1
  102. data/spec/moneta/simple_memory_with_expires_spec.rb +1 -1
  103. data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +1 -1
  104. data/spec/moneta/simple_memory_with_json_serializer_spec.rb +1 -1
  105. data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +1 -1
  106. data/spec/moneta/simple_memory_with_prefix_spec.rb +1 -1
  107. data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +1 -1
  108. data/spec/moneta/simple_mongo_spec.rb +1 -1
  109. data/spec/moneta/simple_null_spec.rb +1 -1
  110. data/spec/moneta/simple_pstore_spec.rb +1 -1
  111. data/spec/moneta/simple_pstore_with_expires_spec.rb +1 -1
  112. data/spec/moneta/simple_redis_spec.rb +1 -1
  113. data/spec/moneta/simple_restclient_spec.rb +1 -1
  114. data/spec/moneta/simple_riak_spec.rb +1 -1
  115. data/spec/moneta/simple_riak_with_expires_spec.rb +1 -1
  116. data/spec/moneta/simple_sdbm_spec.rb +1 -1
  117. data/spec/moneta/simple_sdbm_with_expires_spec.rb +1 -1
  118. data/spec/moneta/simple_sequel_spec.rb +1 -1
  119. data/spec/moneta/simple_sequel_with_expires_spec.rb +1 -1
  120. data/spec/moneta/simple_sqlite_spec.rb +1 -1
  121. data/spec/moneta/simple_sqlite_with_expires_spec.rb +1 -1
  122. data/spec/moneta/simple_tdb_spec.rb +1 -1
  123. data/spec/moneta/simple_tdb_with_expires_spec.rb +1 -1
  124. data/spec/moneta/simple_tokyocabinet_spec.rb +1 -1
  125. data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +1 -1
  126. data/spec/moneta/simple_yaml_spec.rb +1 -1
  127. data/spec/moneta/simple_yaml_with_expires_spec.rb +1 -1
  128. data/spec/moneta/stack_file_memory_spec.rb +2 -2
  129. data/spec/moneta/stack_memory_file_spec.rb +3 -3
  130. data/spec/moneta/transformer_bencode_spec.rb +1 -1
  131. data/spec/moneta/transformer_bert_spec.rb +1 -1
  132. data/spec/moneta/transformer_bson_spec.rb +1 -1
  133. data/spec/moneta/transformer_bzip2_spec.rb +1 -1
  134. data/spec/moneta/transformer_json_spec.rb +1 -1
  135. data/spec/moneta/transformer_key_marshal_spec.rb +19 -19
  136. data/spec/moneta/transformer_key_yaml_spec.rb +19 -19
  137. data/spec/moneta/transformer_lzma_spec.rb +1 -1
  138. data/spec/moneta/transformer_lzo_spec.rb +1 -1
  139. data/spec/moneta/transformer_marshal_base64_spec.rb +1 -1
  140. data/spec/moneta/transformer_marshal_escape_spec.rb +1 -1
  141. data/spec/moneta/transformer_marshal_hmac_spec.rb +1 -1
  142. data/spec/moneta/transformer_marshal_md5_spec.rb +1 -1
  143. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +1 -1
  144. data/spec/moneta/transformer_marshal_prefix_spec.rb +1 -1
  145. data/spec/moneta/transformer_marshal_rmd160_spec.rb +1 -1
  146. data/spec/moneta/transformer_marshal_sha1_spec.rb +1 -1
  147. data/spec/moneta/transformer_marshal_sha256_spec.rb +1 -1
  148. data/spec/moneta/transformer_marshal_sha384_spec.rb +1 -1
  149. data/spec/moneta/transformer_marshal_sha512_spec.rb +1 -1
  150. data/spec/moneta/transformer_marshal_spec.rb +1 -1
  151. data/spec/moneta/transformer_marshal_truncate_spec.rb +1 -1
  152. data/spec/moneta/transformer_marshal_uuencode_spec.rb +1 -1
  153. data/spec/moneta/transformer_msgpack_spec.rb +1 -1
  154. data/spec/moneta/transformer_ox_spec.rb +1 -1
  155. data/spec/moneta/transformer_quicklz_spec.rb +1 -1
  156. data/spec/moneta/transformer_snappy_spec.rb +1 -1
  157. data/spec/moneta/transformer_tnet_spec.rb +1 -1
  158. data/spec/moneta/transformer_value_marshal_spec.rb +1 -1
  159. data/spec/moneta/transformer_value_yaml_spec.rb +1 -1
  160. data/spec/moneta/transformer_yaml_spec.rb +1 -1
  161. data/spec/moneta/transformer_zlib_spec.rb +1 -1
  162. data/spec/monetaspecs.rb +655 -151
  163. metadata +8 -6
  164. data/benchmarks/run.rb +0 -327
  165. data/script/install-bundle.rb +0 -35
data/.gitignore CHANGED
@@ -6,6 +6,5 @@ spec/tmp
6
6
  *.swp
7
7
  *.rdb
8
8
  .#*
9
- benchmarks/*.histogram
10
- benchmarks/bench.*
9
+ script/benchmarks.tmp
11
10
  Gemfile.lock
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.rb
13
+ - script/install-bundle
14
+ - script/upload-bundle
15
+ install: 'echo "Bundle installed"'
17
16
  env:
18
17
  global:
19
- - secure: "bNtinRuxS/FLP1fKj7KtHweIP/fG94CusdYKH/sBL6P0aqL3mr/dkbC34pSk\nNGkLKs/FAzvLkOo7aIOcCLx1WnL9yaZ12tmHgH8Ztf8ci2S52HSfqYwQw/dE\nq7euNMZVjvWfVu+15+Xpn6+t2XSubSO/TELfymDFGbhivmKAo5M="
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
@@ -1,3 +1,8 @@
1
+ 0.7.5
2
+
3
+ * OptionsSupport#with: Add support to insert additional proxies
4
+ * Builder#adapter: Accepts Moneta store instance now
5
+
1
6
  0.7.4
2
7
 
3
8
  * Transformer: fix truncate
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
- alternatives :mri => 'bson_ext', :jruby => 'bson'
21
- alternatives :mri => 'ox'
22
- alternatives :mri => 'msgpack', :jruby => 'msgpack-jruby'
23
- alternatives :mri => 'bert'
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
- alternatives :mri => 'bzip2-ruby'
27
- alternatives :mri => 'ruby-lzma'
28
- alternatives :mri => 'lzoruby'
29
- alternatives :mri => 'snappy'
30
- # WARNING: QuickLZ segfaults because of an assertion
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', :github => 'propublica/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
- alternatives :mri => 'tdb'
50
- alternatives :mri => 'leveldb-ruby'
51
- alternatives :mri => 'tokyocabinet'
52
- alternatives :mri => 'memcached', :jruby => 'jruby-memcached'
53
- alternatives :mri => 'sqlite3', :jruby => %w(jdbc-sqlite3 activerecord-jdbc-adapter activerecord-jdbcsqlite3-adapter)
54
- alternatives :jruby => %w(ffi gdbm) # gdbm for jruby needs ffi
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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Yehuda Katz, 2012 Daniel Mendler
1
+ Copyright (c) 2009 - 2013 Daniel Mendler, Yehuda Katz
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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:blue">?</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>
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:blue">?</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>
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:blue">?</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>
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:blue">?</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>
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`, `Moneta::Pool` or by passing the option `:threadsafe => true` to `Moneta#new`.
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 supports expires values natively.
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 session store
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
- ### Rack Moneta middleware
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
- ### Rack REST server
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
- ### Rack cache
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
- ### Rack cookies
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 session store
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
- ### Rails cache store
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
- # memcached and redis specs cannot be used in parallel
20
- # because of flushing and namespace lacking in redis
21
- specs = Dir['spec/*/*_spec.rb']
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 >= 20
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
- Dir.chdir('benchmarks')
50
- ruby("run.rb #{ENV['CONFIG']}")
80
+ ruby("script/benchmarks #{ENV['CONFIG']}")
51
81
  end
52
82
 
53
83
  task :default => :test
@@ -14,8 +14,12 @@ module Moneta
14
14
  # @return [Object] Generated Moneta proxy stack
15
15
  # @api public
16
16
  def build
17
- klass, options, block = @proxies.first
18
- @proxies[1..-1].inject([klass.new(options, &block)]) do |stores, proxy|
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 or Class] proxy Name of proxy class or proxy class
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] name Name of adapter class
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(name, options = {}, &block)
42
- use(Adapters.const_get(name), options, &block)
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 [OptionMerger]
7
+ # @return [Moneta store]
8
+ #
8
9
  # @api public
9
- def with(options)
10
- OptionMerger.new(self, options)
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
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '0.7.4'
4
+ VERSION = '0.7.5'
5
5
  end