moneta 0.7.4 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
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