moneta 0.7.10 → 0.7.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. data/.travis.yml +2 -2
  2. data/CHANGES +8 -0
  3. data/Gemfile +7 -2
  4. data/README.md +7 -7
  5. data/Rakefile +35 -31
  6. data/lib/moneta/adapters/cassandra.rb +4 -0
  7. data/lib/moneta/adapters/couch.rb +36 -24
  8. data/lib/moneta/adapters/hbase.rb +5 -0
  9. data/lib/moneta/adapters/restclient.rb +11 -19
  10. data/lib/moneta/adapters/tokyotyrant.rb +27 -16
  11. data/lib/moneta/logger.rb +24 -7
  12. data/lib/moneta/transformer/config.rb +1 -0
  13. data/lib/moneta/version.rb +1 -1
  14. data/lib/rack/moneta_rest.rb +1 -1
  15. data/script/benchmarks +27 -27
  16. data/script/generate-specs +18 -9
  17. data/script/start-services +9 -1
  18. data/spec/moneta/adapter_activerecord_spec.rb +0 -4
  19. data/spec/moneta/adapter_cassandra_spec.rb +0 -4
  20. data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +0 -4
  21. data/spec/moneta/adapter_client_spec.rb +0 -4
  22. data/spec/moneta/adapter_cookie_spec.rb +0 -4
  23. data/spec/moneta/adapter_couch_spec.rb +0 -4
  24. data/spec/moneta/adapter_datamapper_spec.rb +0 -4
  25. data/spec/moneta/adapter_daybreak_spec.rb +0 -4
  26. data/spec/moneta/adapter_dbm_spec.rb +0 -4
  27. data/spec/moneta/adapter_file_spec.rb +0 -4
  28. data/spec/moneta/adapter_fog_spec.rb +0 -4
  29. data/spec/moneta/adapter_gdbm_spec.rb +0 -4
  30. data/spec/moneta/adapter_hbase_spec.rb +0 -4
  31. data/spec/moneta/adapter_kyotocabinet_spec.rb +0 -4
  32. data/spec/moneta/adapter_leveldb_spec.rb +0 -4
  33. data/spec/moneta/adapter_localmemcache_spec.rb +0 -4
  34. data/spec/moneta/adapter_lruhash_spec.rb +0 -4
  35. data/spec/moneta/adapter_memcached_dalli_spec.rb +0 -4
  36. data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +0 -4
  37. data/spec/moneta/adapter_memcached_native_spec.rb +0 -4
  38. data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +0 -4
  39. data/spec/moneta/adapter_memcached_spec.rb +0 -4
  40. data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +0 -4
  41. data/spec/moneta/adapter_memory_spec.rb +0 -4
  42. data/spec/moneta/adapter_mongo_spec.rb +0 -4
  43. data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +0 -4
  44. data/spec/moneta/adapter_pstore_spec.rb +0 -4
  45. data/spec/moneta/adapter_redis_spec.rb +0 -4
  46. data/spec/moneta/adapter_redis_with_default_expires_spec.rb +0 -4
  47. data/spec/moneta/adapter_restclient_spec.rb +0 -4
  48. data/spec/moneta/adapter_riak_spec.rb +0 -4
  49. data/spec/moneta/adapter_sdbm_spec.rb +0 -4
  50. data/spec/moneta/adapter_sequel_spec.rb +0 -4
  51. data/spec/moneta/adapter_sqlite_spec.rb +0 -4
  52. data/spec/moneta/adapter_tdb_spec.rb +0 -4
  53. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +0 -4
  54. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +0 -4
  55. data/spec/moneta/adapter_tokyotyrant_spec.rb +0 -4
  56. data/spec/moneta/adapter_yaml_spec.rb +0 -4
  57. data/spec/moneta/cache_file_memory_spec.rb +0 -4
  58. data/spec/moneta/cache_memory_null_spec.rb +0 -4
  59. data/spec/moneta/expires_file_spec.rb +0 -4
  60. data/spec/moneta/expires_memory_spec.rb +0 -4
  61. data/spec/moneta/expires_memory_with_default_expires_spec.rb +0 -4
  62. data/spec/moneta/lock_spec.rb +0 -4
  63. data/spec/moneta/mutex_spec.rb +1 -5
  64. data/spec/moneta/null_adapter_spec.rb +0 -4
  65. data/spec/moneta/optionmerger_spec.rb +1 -5
  66. data/spec/moneta/pool_spec.rb +0 -4
  67. data/spec/moneta/proxy_expires_memory_spec.rb +0 -4
  68. data/spec/moneta/proxy_redis_spec.rb +0 -4
  69. data/spec/moneta/semaphore_spec.rb +1 -5
  70. data/spec/moneta/shared_tcp_spec.rb +0 -4
  71. data/spec/moneta/shared_unix_spec.rb +0 -4
  72. data/spec/moneta/simple_activerecord_spec.rb +1 -5
  73. data/spec/moneta/simple_activerecord_with_expires_spec.rb +1 -5
  74. data/spec/moneta/simple_cassandra_spec.rb +1 -5
  75. data/spec/moneta/simple_client_tcp_spec.rb +1 -5
  76. data/spec/moneta/simple_client_unix_spec.rb +1 -5
  77. data/spec/moneta/simple_couch_spec.rb +1 -5
  78. data/spec/moneta/simple_couch_with_expires_spec.rb +1 -5
  79. data/spec/moneta/simple_datamapper_spec.rb +1 -5
  80. data/spec/moneta/simple_datamapper_with_expires_spec.rb +1 -5
  81. data/spec/moneta/simple_datamapper_with_repository_spec.rb +1 -5
  82. data/spec/moneta/simple_daybreak_spec.rb +1 -5
  83. data/spec/moneta/simple_daybreak_with_expires_spec.rb +1 -5
  84. data/spec/moneta/simple_dbm_spec.rb +1 -5
  85. data/spec/moneta/simple_dbm_with_expires_spec.rb +1 -5
  86. data/spec/moneta/simple_file_spec.rb +1 -5
  87. data/spec/moneta/simple_file_with_expires_spec.rb +1 -5
  88. data/spec/moneta/simple_fog_spec.rb +1 -5
  89. data/spec/moneta/simple_fog_with_expires_spec.rb +1 -5
  90. data/spec/moneta/simple_gdbm_spec.rb +1 -5
  91. data/spec/moneta/simple_gdbm_with_expires_spec.rb +1 -5
  92. data/spec/moneta/simple_hashfile_spec.rb +1 -5
  93. data/spec/moneta/simple_hashfile_with_expires_spec.rb +1 -5
  94. data/spec/moneta/simple_hbase_spec.rb +1 -5
  95. data/spec/moneta/simple_hbase_with_expires_spec.rb +1 -5
  96. data/spec/moneta/simple_kyotocabinet_spec.rb +1 -5
  97. data/spec/moneta/simple_kyotocabinet_with_expires_spec.rb +1 -5
  98. data/spec/moneta/simple_leveldb_spec.rb +1 -5
  99. data/spec/moneta/simple_leveldb_with_expires_spec.rb +1 -5
  100. data/spec/moneta/simple_localmemcache_spec.rb +1 -5
  101. data/spec/moneta/simple_localmemcache_with_expires_spec.rb +1 -5
  102. data/spec/moneta/simple_lruhash_spec.rb +1 -5
  103. data/spec/moneta/simple_lruhash_with_expires_spec.rb +1 -5
  104. data/spec/moneta/simple_memcached_dalli_spec.rb +1 -5
  105. data/spec/moneta/simple_memcached_native_spec.rb +1 -5
  106. data/spec/moneta/simple_memcached_spec.rb +1 -5
  107. data/spec/moneta/simple_memory_spec.rb +1 -5
  108. data/spec/moneta/simple_memory_with_compress_spec.rb +1 -5
  109. data/spec/moneta/simple_memory_with_expires_spec.rb +1 -5
  110. data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +1 -5
  111. data/spec/moneta/simple_memory_with_json_serializer_spec.rb +1 -5
  112. data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +1 -5
  113. data/spec/moneta/simple_memory_with_prefix_spec.rb +1 -5
  114. data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +1 -5
  115. data/spec/moneta/simple_mongo_spec.rb +1 -5
  116. data/spec/moneta/simple_null_spec.rb +1 -5
  117. data/spec/moneta/simple_pstore_spec.rb +1 -5
  118. data/spec/moneta/simple_pstore_with_expires_spec.rb +1 -5
  119. data/spec/moneta/simple_redis_spec.rb +1 -5
  120. data/spec/moneta/simple_restclient_spec.rb +1 -5
  121. data/spec/moneta/simple_riak_spec.rb +1 -5
  122. data/spec/moneta/simple_riak_with_expires_spec.rb +1 -5
  123. data/spec/moneta/simple_sdbm_spec.rb +1 -5
  124. data/spec/moneta/simple_sdbm_with_expires_spec.rb +1 -5
  125. data/spec/moneta/simple_sequel_spec.rb +1 -5
  126. data/spec/moneta/simple_sequel_with_expires_spec.rb +1 -5
  127. data/spec/moneta/simple_sqlite_spec.rb +1 -5
  128. data/spec/moneta/simple_sqlite_with_expires_spec.rb +1 -5
  129. data/spec/moneta/simple_tdb_spec.rb +1 -5
  130. data/spec/moneta/simple_tdb_with_expires_spec.rb +1 -5
  131. data/spec/moneta/simple_tokyocabinet_spec.rb +1 -5
  132. data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +1 -5
  133. data/spec/moneta/simple_tokyotyrant_spec.rb +1 -5
  134. data/spec/moneta/simple_tokyotyrant_with_expires_spec.rb +1 -5
  135. data/spec/moneta/simple_yaml_spec.rb +1 -5
  136. data/spec/moneta/simple_yaml_with_expires_spec.rb +1 -5
  137. data/spec/moneta/stack_file_memory_spec.rb +0 -4
  138. data/spec/moneta/stack_memory_file_spec.rb +0 -4
  139. data/spec/moneta/transformer_bencode_spec.rb +0 -4
  140. data/spec/moneta/transformer_bert_spec.rb +0 -4
  141. data/spec/moneta/transformer_bson_spec.rb +0 -4
  142. data/spec/moneta/transformer_bzip2_spec.rb +0 -4
  143. data/spec/moneta/transformer_json_spec.rb +0 -4
  144. data/spec/moneta/transformer_key_inspect_spec.rb +0 -4
  145. data/spec/moneta/transformer_key_marshal_spec.rb +0 -4
  146. data/spec/moneta/transformer_key_to_s_spec.rb +0 -4
  147. data/spec/moneta/transformer_key_yaml_spec.rb +0 -4
  148. data/spec/moneta/transformer_lzma_spec.rb +0 -4
  149. data/spec/moneta/transformer_lzo_spec.rb +0 -4
  150. data/spec/moneta/transformer_marshal_base64_spec.rb +0 -4
  151. data/spec/moneta/transformer_marshal_escape_spec.rb +0 -4
  152. data/spec/moneta/transformer_marshal_hmac_spec.rb +0 -4
  153. data/spec/moneta/transformer_marshal_md5_spec.rb +0 -4
  154. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +0 -4
  155. data/spec/moneta/transformer_marshal_prefix_spec.rb +0 -4
  156. data/spec/moneta/transformer_marshal_qp_spec.rb +122 -0
  157. data/spec/moneta/transformer_marshal_rmd160_spec.rb +0 -4
  158. data/spec/moneta/transformer_marshal_sha1_spec.rb +0 -4
  159. data/spec/moneta/transformer_marshal_sha256_spec.rb +0 -4
  160. data/spec/moneta/transformer_marshal_sha384_spec.rb +0 -4
  161. data/spec/moneta/transformer_marshal_sha512_spec.rb +0 -4
  162. data/spec/moneta/transformer_marshal_spec.rb +0 -4
  163. data/spec/moneta/transformer_marshal_truncate_spec.rb +0 -4
  164. data/spec/moneta/transformer_marshal_uuencode_spec.rb +0 -4
  165. data/spec/moneta/transformer_msgpack_spec.rb +0 -4
  166. data/spec/moneta/transformer_ox_spec.rb +0 -4
  167. data/spec/moneta/transformer_quicklz_spec.rb +0 -4
  168. data/spec/moneta/transformer_snappy_spec.rb +0 -4
  169. data/spec/moneta/transformer_tnet_spec.rb +0 -4
  170. data/spec/moneta/transformer_value_marshal_spec.rb +0 -4
  171. data/spec/moneta/transformer_value_yaml_spec.rb +0 -4
  172. data/spec/moneta/transformer_yaml_spec.rb +0 -4
  173. data/spec/moneta/transformer_zlib_spec.rb +0 -4
  174. data/spec/moneta/weak_create_spec.rb +0 -4
  175. data/spec/moneta/weak_increment_spec.rb +0 -4
  176. data/spec/monetaspecs.rb +4 -4
  177. metadata +4 -2
data/.travis.yml CHANGED
@@ -4,8 +4,8 @@ rvm:
4
4
  - 1.9.3
5
5
  - jruby-18mode
6
6
  - jruby-19mode
7
- - rbx-18mode
8
- - rbx-19mode
7
+ # - rbx-18mode
8
+ # - rbx-19mode
9
9
  before_install:
10
10
  - script/kill-travis
11
11
  - script/install-kyotocabinet
data/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ 0.7.11
2
+
3
+ * Logger: Add option :file
4
+ * Adapters::TokyoTyrant supports both native (ruby-tokyotyrant) and pure-ruby tokyotyrant gems
5
+ * Adapters::Couch use Faraday directly instead of buggy CouchRest
6
+ * Adapters::RestClient use Faraday
7
+ * Transformer: add quoted printable encoding (:qp)
8
+
1
9
  0.7.10
2
10
 
3
11
  * Adapters::TokyoTyrant added
data/Gemfile CHANGED
@@ -25,6 +25,7 @@ gem 'snappy', :platforms => :ruby
25
25
  gem 'qlzruby', :platforms => :ruby
26
26
 
27
27
  # Backends
28
+ gem 'faraday'
28
29
  gem 'daybreak'
29
30
  gem 'dm-core'
30
31
  gem 'dm-migrations'
@@ -33,18 +34,22 @@ gem 'fog'
33
34
  gem 'activerecord', '>= 3.2.9'
34
35
  gem 'redis'
35
36
  gem 'mongo'
36
- gem 'couchrest'
37
37
  gem 'sequel'
38
38
  gem 'dalli'
39
39
  gem 'riak-client'
40
40
  gem 'cassandra'
41
41
  gem 'tokyotyrant'
42
+ #gem 'ruby-tokyotyrant', :platforms => :ruby
42
43
  #gem 'hbaserb'
43
44
  #gem 'localmemcache'
44
45
  gem 'tdb', :platforms => :ruby
45
46
  gem 'leveldb-ruby', :platforms => :ruby
46
47
  gem 'tokyocabinet', :platforms => :ruby
47
- gem 'kyotocabinet-ruby', :platforms => :ruby, :github => 'minad/kyotocabinet-ruby'
48
+ unless defined?(JRUBY_VERSION)
49
+ # FIXME: We have to check manually for jruby
50
+ # otherwise bundle install --deployment doesn't work
51
+ gem 'kyotocabinet-ruby', :github => 'minad/kyotocabinet-ruby'
52
+ end
48
53
  gem 'memcached', :platforms => :ruby
49
54
  gem 'jruby-memcached', :platforms => :jruby
50
55
  gem 'sqlite3', :platforms => :ruby
data/README.md CHANGED
@@ -148,7 +148,7 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
148
148
 
149
149
  <tr><td>PStore</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://ruby-doc.org/stdlib/libdoc/pstore/rdoc/PStore.html">PStore</a> store</td></tr>
150
150
 
151
- <tr><td>TokyoTyrant</td><td>tokoytyrant</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/tokyotyrant/">TokyoTyrant</a> database</td></tr>
151
+ <tr><td>TokyoTyrant</td><td>tokyotyrant or ruby-tokyotyrant</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/tokyotyrant/">TokyoTyrant</a> database</td></tr>
152
152
 
153
153
  <tr><td>YAML</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/yaml/rdoc/YAML/Store.html">YAML</a> store</td></tr>
154
154
 
@@ -164,22 +164,22 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
164
164
 
165
165
  <tr><td>TDB</td><td>tdb</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://tdb.samba.org/">TDB</a> database</td></tr>
166
166
 
167
- <tr><td>KyotoCabinet</td><td>tokoycabinet</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/kyotocabinet/">KyotoCabinet</a> database</td></tr>
167
+ <tr><td>KyotoCabinet</td><td>kyotocabinet</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/kyotocabinet/">KyotoCabinet</a> database</td></tr>
168
168
 
169
- <tr><td>TokyoCabinet</td><td>tokoycabinet</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/tokyocabinet/">TokyoCabinet</a> database</td></tr>
169
+ <tr><td>TokyoCabinet</td><td>tokyocabinet</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/tokyocabinet/">TokyoCabinet</a> database</td></tr>
170
170
 
171
171
  <tr><td>DataMapper</td><td>dm-core, dm-migrations</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://datamapper.org/">DataMapper</a> ORM</td></tr>
172
172
 
173
+ <tr><td>HBase</td><td>hbaserb</td><td style="text-align:center;background:#55F">?</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://hbase.apache.org/">HBase</a> database</td></tr>
174
+
173
175
  <tr><td>Cassandra</td><td>cassandra</td><td style="text-align:center;background:#55F">?</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://cassandra.apache.org/">Cassandra</a> distributed database</td></tr>
174
176
 
175
177
  <tr><td>LocalMemCache</td><td>localmemcache</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://localmemcache.rubyforge.org/">LocalMemCache</a> database</td></tr>
176
178
 
177
- <tr><td>Couch</td><td>couchrest</td><td style="text-align:center;background:#55F">?</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://couchdb.apache.org/">CouchDB</a> database</td></tr>
179
+ <tr><td>Couch</td><td>faraday, multi_json</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://couchdb.apache.org/">CouchDB</a> database</td></tr>
178
180
 
179
181
  <tr><td>Fog</td><td>fog</td><td style="text-align:center;background:#55F">?</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fog.io/">Fog</a> cloud store</td></tr>
180
182
 
181
- <tr><td>HBase</td><td>hbase</td><td style="text-align:center;background:#55F">?</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://hbase.apache.org/">HBase</a> database</td></tr>
182
-
183
183
  <tr><td>Riak</td><td>riak-client</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://docs.basho.com/">Riak</a> database</td></tr>
184
184
 
185
185
  <tr><th colspan="2">Non persistent stores</th><th colspan="7"></th></tr>
@@ -200,7 +200,7 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
200
200
 
201
201
  <tr><td>Client</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td>Moneta client adapter</td></tr>
202
202
 
203
- <tr><td>RestClient</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td>Moneta REST client adapter</td></tr>
203
+ <tr><td>RestClient</td><td>faraday</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">?<sup>[5]</sup></td><td>Moneta REST client adapter</td></tr>
204
204
 
205
205
  </table>
206
206
 
data/Rakefile CHANGED
@@ -18,53 +18,60 @@ end
18
18
  task :test do
19
19
  specs = Dir['spec/*/*_spec.rb'].sort
20
20
 
21
+ # Shuffle specs to ensure equal distribution over the test groups
22
+ # We have to shuffle with the same seed every time because rake is started
23
+ # multiple times!
24
+ old_seed = srand(42)
25
+ specs.shuffle!
26
+ srand(old_seed)
27
+
28
+ group = ENV['TEST_GROUP'] || '1/1'
29
+
21
30
  # FIXME:
22
31
  #
23
32
  # * QuickLZ segfaults because of an assertion
24
33
  # QuickLZ is also not maintained on Github, but on Bitbucket
25
34
  # and I don't know where the issue tracker is.
26
35
  #
27
- # * Cassandra show spurious failures
28
- #
29
36
  # * action_dispatch cannot be required for an unknown reason
30
- if ENV['TEST_GROUP']
31
- # Shuffle specs to ensure equal distribution over the test groups
32
- # We have to shuffle with the same seed every time because rake is started
33
- # multiple times!
34
- old_seed = srand(42)
35
- specs.shuffle!
36
- srand(old_seed)
37
-
38
- unstable = specs.select {|s| s =~ /quicklz|action_dispatch/ }
39
- specs -= unstable
40
- end
41
-
42
- # Memcached and Redis specs cannot be used in parallel
43
- # because of flushing and lacking namespaces
44
- parallel = specs.reject {|s| s =~ /memcached|redis|client|shared|riak|tokyotyrant|couch|cassandra/ }
45
- serial = specs - parallel
37
+ unstable = specs.select {|s| s =~ /quicklz|action_dispatch/ }
38
+ specs -= unstable
46
39
 
47
- if ENV['TEST_GROUP'] =~ /^(\d+)\/(\d+)$/
40
+ if group =~ /^(\d+)\/(\d+)$/
48
41
  n = $1.to_i
49
42
  max = $2.to_i
50
43
  if n == max
51
- parallel = parallel[(n-1)*(parallel.size/max)..-1]
52
- serial = serial[(n-1)*(serial.size/max)..-1]
44
+ specs = specs[(n-1)*(specs.size/max)..-1]
53
45
  else
54
- parallel = parallel[(n-1)*(parallel.size/max), parallel.size/max]
55
- serial = serial[(n-1)*(serial.size/max), serial.size/max]
46
+ specs = specs[(n-1)*(specs.size/max), specs.size/max]
56
47
  end
57
- elsif ENV['TEST_GROUP'] == 'unstable'
58
- parallel.clear
59
- serial = unstable
48
+ elsif group == 'unstable'
49
+ specs = unstable
50
+ else
51
+ puts "Invalid test group #{group}"
52
+ exit 1
60
53
  end
61
54
 
55
+ # Memcached and Redis specs cannot be used in parallel
56
+ # because of flushing and lacking namespaces
57
+ parallel = []
58
+ %w(memcached redis client shared riak tokyotyrant couch cassandra).each do |name|
59
+ serial = specs.select { |s| s.include?(name) }
60
+ unless serial.empty?
61
+ specs -= serial
62
+ parallel << serial
63
+ end
64
+ end
65
+ parallel += specs.map {|s| [s] }
66
+
62
67
  threads = []
63
68
  failed = false
64
- parallel.each do |spec|
69
+ parallel.each do |serial|
65
70
  threads << Thread.new do
66
71
  begin
67
- failed = true unless rspec(spec)
72
+ serial.each do |spec|
73
+ failed = true unless rspec(spec)
74
+ end
68
75
  ensure
69
76
  threads.delete Thread.current
70
77
  end
@@ -73,9 +80,6 @@ task :test do
73
80
  sleep 0.1 while threads.size >= 10
74
81
  end
75
82
  sleep 0.1 until threads.empty?
76
- serial.each do |spec|
77
- failed = true unless rspec(spec)
78
- end
79
83
  if failed
80
84
  fail "\e[31m########## MONETA TESTSUITE FAILED ##########\e[0m"
81
85
  else
@@ -74,6 +74,10 @@ module Moneta
74
74
  def store(key, value, options = {})
75
75
  @backend.insert(@cf, key, {'value' => value}, :ttl => expires_value(options) || nil)
76
76
  value
77
+ rescue
78
+ # FIXME: We get spurious cassandra transport exceptions
79
+ tries ||= 0
80
+ (tries += 1) < 10 ? retry : raise
77
81
  end
78
82
 
79
83
  # (see Proxy#delete)
@@ -1,4 +1,5 @@
1
- require 'couchrest'
1
+ require 'faraday'
2
+ require 'multi_json'
2
3
 
3
4
  module Moneta
4
5
  module Adapters
@@ -10,56 +11,67 @@ module Moneta
10
11
  attr_reader :backend
11
12
 
12
13
  # @param [Hash] options
13
- # @option options [String] :host ('http://127.0.0.1:5984') Couch host
14
+ # @option options [String] :host ('127.0.0.1') Couch host
15
+ # @option options [String] :port (5984) Couch port
14
16
  # @option options [String] :db ('moneta') Couch database
15
- # @option options [::CouchRest] :backend Use existing backend instance
17
+ # @option options [Faraday connection] :backend Use existing backend instance
16
18
  def initialize(options = {})
17
- @backend = options[:backend] || CouchRest.new(options[:host] || '127.0.0.1:5984')
18
- @db = @backend.database!(options[:db] || 'moneta')
19
+ url = "http://#{options[:host] || '127.0.0.1'}:#{options[:port] || 5984}/#{options[:db] || 'moneta'}"
20
+ @backend = options[:backend] || ::Faraday.new(:url => url)
21
+ create_db
19
22
  end
20
23
 
21
24
  # (see Proxy#key?)
22
25
  def key?(key, options = {})
23
- @db.get(key) != nil
24
- rescue ::RestClient::ResourceNotFound
25
- false
26
+ @backend.head(key).status == 200
26
27
  end
27
28
 
28
29
  # (see Proxy#load)
29
30
  def load(key, options = {})
30
- @db.get(key)['value']
31
- rescue ::RestClient::ResourceNotFound
32
- nil
31
+ response = @backend.get(key)
32
+ response.status == 200 ? MultiJson.load(response.body)['value'] : nil
33
33
  end
34
34
 
35
35
  # (see Proxy#store)
36
36
  def store(key, value, options = {})
37
- doc = {'_id' => key, 'value' => value}
38
- begin
39
- doc['_rev'] = @db.get(key)['_rev']
40
- rescue ::RestClient::ResourceNotFound
41
- end
42
- @db.save_doc(doc)
37
+ response = @backend.head(key)
38
+ doc = { 'value' => value }
39
+ doc['_rev'] = response['etag'][1..-2] if response.status == 200
40
+ response = @backend.put(key, MultiJson.dump(doc), 'Content-Type' => 'application/json')
41
+ raise "HTTP error #{response.status}" unless response.status == 201
43
42
  value
44
- rescue ::RestClient::RequestFailed
43
+ rescue
45
44
  tries ||= 0
46
45
  (tries += 1) < 10 ? retry : raise
47
46
  end
48
47
 
49
48
  # (see Proxy#delete)
50
49
  def delete(key, options = {})
51
- value = @db.get(key)
52
- @db.delete_doc('_id' => value['_id'], '_rev' => value['_rev'])
53
- value['value']
54
- rescue ::RestClient::ResourceNotFound
55
- nil
50
+ response = @backend.get(key)
51
+ if response.status == 200
52
+ value = MultiJson.load(response.body)['value']
53
+ response = @backend.delete("#{key}?rev=#{response['etag'][1..-2]}")
54
+ raise "HTTP error #{response.status}" unless response.status == 200
55
+ value
56
+ end
57
+ rescue
58
+ tries ||= 0
59
+ (tries += 1) < 10 ? retry : raise
56
60
  end
57
61
 
58
62
  # (see Proxy#clear)
59
63
  def clear(options = {})
60
- @db.recreate!
64
+ @backend.delete ''
65
+ create_db
61
66
  self
62
67
  end
68
+
69
+ private
70
+
71
+ def create_db
72
+ response = @backend.put '', ''
73
+ raise "HTTP error #{response.status}" unless response.status == 201 || response.status == 412
74
+ end
63
75
  end
64
76
  end
65
77
  end
@@ -9,6 +9,11 @@ module Moneta
9
9
 
10
10
  attr_reader :backend
11
11
 
12
+ # TODO: Add create support using checkAndPut if added to thrift api
13
+ # https://issues.apache.org/jira/browse/HBASE-3307
14
+ # https://github.com/bmuller/hbaserb/issues/2
15
+ supports :increment
16
+
12
17
  # @param [Hash] options
13
18
  # @option options [String] :host ('127.0.0.1') Server host name
14
19
  # @option options [Integer] :port (9090) Server port
@@ -1,4 +1,4 @@
1
- require 'net/http'
1
+ require 'faraday'
2
2
 
3
3
  module Moneta
4
4
  module Adapters
@@ -11,49 +11,41 @@ module Moneta
11
11
 
12
12
  # @param [Hash] options
13
13
  # @option options [String] :url URL
14
- # @option options [::Net::HTTP] :backend Use existing backend instance
14
+ # @option options [Faraday connection] :backend Use existing backend instance
15
15
  def initialize(options = {})
16
16
  raise ArgumentError, 'Option :url is required' unless url = options[:url]
17
- url = URI(url)
18
- @path = url.path
19
- @backend = options[:backend] || ::Net::HTTP.start(url.host, url.port)
17
+ @backend = options[:backend] || ::Faraday.new(:url => url)
20
18
  end
21
19
 
22
20
  # (see Proxy#key?)
23
21
  def key?(key, options = {})
24
- response = @backend.request_head(@path + key)
25
- response.code == '200'
22
+ @backend.head(key).status == 200
26
23
  end
27
24
 
28
25
  # (see Proxy#load)
29
26
  def load(key, options = {})
30
- response = @backend.request_get(@path + key)
31
- response.code == '200' ? response.body : nil
27
+ response = @backend.get(key)
28
+ response.status == 200 ? response.body : nil
32
29
  end
33
30
 
34
31
  # (see Proxy#store)
35
32
  def store(key, value, options = {})
36
- response = @backend.request_post(@path + key, value)
37
- raise "HTTP error #{response.code}" unless response.code == '200'
33
+ response = @backend.post(key, value)
34
+ raise "HTTP error #{response.status}" unless response.status == 200
38
35
  value
39
36
  end
40
37
 
41
38
  # (see Proxy#delete)
42
39
  def delete(key, options = {})
43
- response = @backend.request(::Net::HTTP::Delete.new(@path + key))
44
- response.code == '200' ? response.body : nil
40
+ response = @backend.delete(key)
41
+ response.status == 200 ? response.body : nil
45
42
  end
46
43
 
47
44
  # (see Proxy#clear)
48
45
  def clear(options = {})
49
- @backend.request(::Net::HTTP::Delete.new(@path))
46
+ @backend.delete ''
50
47
  self
51
48
  end
52
-
53
- def close
54
- @backend.finish
55
- nil
56
- end
57
49
  end
58
50
  end
59
51
  end
@@ -1,4 +1,10 @@
1
- require 'tokyotyrant'
1
+ begin
2
+ # Native client
3
+ require 'tokyo_tyrant'
4
+ rescue LoadError
5
+ # Ruby client
6
+ require 'tokyotyrant'
7
+ end
2
8
 
3
9
  module Moneta
4
10
  module Adapters
@@ -6,6 +12,7 @@ module Moneta
6
12
  # @api public
7
13
  class TokyoTyrant
8
14
  include Defaults
15
+ include HashAdapter
9
16
 
10
17
  supports :create, :increment
11
18
  attr_reader :backend
@@ -15,24 +22,25 @@ module Moneta
15
22
  # @option options [Integer] :port (1978) Server port
16
23
  # @option options [::TokyoTyrant::RDB] :backend Use existing backend instance
17
24
  def initialize(options = {})
25
+ options[:host] ||= '127.0.0.1'
26
+ options[:port] ||= 1978
18
27
  if options[:backend]
19
28
  @backend = options[:backend]
20
- else
29
+ elsif defined?(::TokyoTyrant::RDB)
30
+ # Use ruby client
21
31
  @backend = ::TokyoTyrant::RDB.new
22
- @backend.open(options[:host] || '127.0.0.1',
23
- options[:port] || 1978) or raise @backend.errmsg(@backend.ecode)
32
+ @backend.open(options[:host], options[:port]) or raise @backend.errmsg(@backend.ecode)
33
+ else
34
+ # Use native client
35
+ @backend = ::TokyoTyrant::DB.new(options[:host], options[:port])
24
36
  end
37
+ @native = @backend.class.name != 'TokyoTyrant::RDB'
25
38
  probe = '__tokyotyrant_endianness_probe'
26
39
  @backend.delete(probe)
27
40
  @backend.addint(probe, 1)
28
41
  @pack = @backend.delete(probe) == [1].pack('l>') ? 'l>' : 'l<'
29
42
  end
30
43
 
31
- # (see Proxy#key?)
32
- def key?(key, options = {})
33
- @backend.has_key?(key)
34
- end
35
-
36
44
  # (see Proxy#load)
37
45
  def load(key, options = {})
38
46
  value = @backend[key]
@@ -61,13 +69,16 @@ module Moneta
61
69
 
62
70
  # (see Proxy#create)
63
71
  def create(key, value, options = {})
64
- @backend.putkeep(key, pack(value))
65
- end
66
-
67
- # (see Proxy#clear)
68
- def clear(options = {})
69
- @backend.clear
70
- self
72
+ if @native
73
+ begin
74
+ # Native client throws an exception
75
+ @backend.putkeep(key, pack(value))
76
+ rescue TokyoTyrantError
77
+ false
78
+ end
79
+ else
80
+ @backend.putkeep(key, pack(value))
81
+ end
71
82
  end
72
83
 
73
84
  # (see Proxy#close)
data/lib/moneta/logger.rb CHANGED
@@ -7,13 +7,23 @@ module Moneta
7
7
  class Format
8
8
  def initialize(options)
9
9
  @prefix = options[:prefix] || 'Moneta '
10
- @out = options[:out] || STDOUT
10
+ if options[:file]
11
+ @close = true
12
+ @out = File.open(options[:file], 'a')
13
+ else
14
+ @close = options[:close]
15
+ @out = options[:out] || STDOUT
16
+ end
11
17
  end
12
18
 
13
- def call(entry)
19
+ def log(entry)
14
20
  @out.write(format(entry))
15
21
  end
16
22
 
23
+ def close
24
+ @out.close if @close
25
+ end
26
+
17
27
  protected
18
28
 
19
29
  def format(entry)
@@ -35,22 +45,29 @@ module Moneta
35
45
 
36
46
  # @param [Moneta store] adapter The underlying store
37
47
  # @param [Hash] options
38
- # @option options [Object] :logger (Moneta::Logger::Format) Callable logger object
39
- # @option options [String] :logprefix ('Moneta ') Prefix string
40
- # @option options [IO] :logout (STDOUT) Output
48
+ # @option options [Object] :logger (Moneta::Logger::Format) Logger object
49
+ # @option options [String] :prefix ('Moneta ') Prefix string
50
+ # @option options [File] :file Log file
51
+ # @option options [IO] :out (STDOUT) Output
41
52
  def initialize(adapter, options = {})
42
53
  super
43
54
  @logger = options[:logger] || Format.new(options)
44
55
  end
45
56
 
57
+ def close
58
+ super
59
+ @logger.close
60
+ nil
61
+ end
62
+
46
63
  protected
47
64
 
48
65
  def wrap(method, *args)
49
66
  ret = yield
50
- @logger.call(:method => method, :args => args, :return => (method == :clear ? 'self' : ret))
67
+ @logger.log(:method => method, :args => args, :return => (method == :clear ? 'self' : ret))
51
68
  ret
52
69
  rescue Exception => error
53
- @logger.call(:method => method, :args => args, :error => error)
70
+ @logger.log(:method => method, :args => args, :error => error)
54
71
  raise
55
72
  end
56
73
  end
@@ -18,6 +18,7 @@ module Moneta
18
18
  :snappy => [ :compress, '::Snappy.inflate(%s)', '::Snappy.deflate(%s)', 'snappy' ],
19
19
  :quicklz => [ :compress, '::QuickLZ.decompress(%s)', '::QuickLZ.compress(%s)', 'qlzruby' ],
20
20
  :zlib => [ :compress, '::Zlib::Inflate.inflate(%s)', '::Zlib::Deflate.deflate(%s)', 'zlib' ],
21
+ :qp => [ :encode, "%s.unpack('M').first", "[%s].pack('M').strip" ],
21
22
  :uuencode => [ :encode, "%s.unpack('u').first", "[%s].pack('u').strip" ],
22
23
  :base64 => RUBY_VERSION > '1.9' ?
23
24
  [ :encode, "%s.unpack('m0').first", "[%s].pack('m0')" ] :
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '0.7.10'
4
+ VERSION = '0.7.11'
5
5
  end
@@ -28,7 +28,7 @@ module Rack
28
28
  end
29
29
 
30
30
  def call(env)
31
- key = env['PATH_INFO'][1..-1]
31
+ key = env['PATH_INFO'][1..-1].to_s
32
32
  case env['REQUEST_METHOD']
33
33
  when 'HEAD'
34
34
  if key.empty?
data/script/benchmarks CHANGED
@@ -31,10 +31,9 @@ class MonetaBenchmarks
31
31
  FileUtils.mkpath(DIR)
32
32
 
33
33
  STORES = {
34
- # SDBM is unstable, the rest is too slow
34
+ # SDBM is unstable, YAML is too slow
35
35
  # :SDBM => { :file => "#{DIR}/sdbm" },
36
36
  # :YAML => { :file => "#{DIR}/yaml" },
37
- # :RestClient => { :url => 'http://localhost:8808/' },
38
37
  :ActiveRecord => { :connection => { :adapter => 'sqlite3', :database => ':memory:' } },
39
38
  :Cassandra => {},
40
39
  :Client => {},
@@ -56,6 +55,7 @@ class MonetaBenchmarks
56
55
  :Mongo => {},
57
56
  :PStore => { :file => "#{DIR}/pstore" },
58
57
  :Redis => {},
58
+ :RestClient => { :url => 'http://localhost:8808/' },
59
59
  :Riak => {},
60
60
  :Sequel => { :db => 'sqlite:/' },
61
61
  :Sqlite => { :file => ':memory:' },
@@ -188,31 +188,31 @@ class MonetaBenchmarks
188
188
  end
189
189
  end
190
190
 
191
- # parallel do
192
- # begin
193
- # require 'rack'
194
- # require 'webrick'
195
- # require 'rack/moneta_rest'
196
-
197
- # # Keep webrick quiet
198
- # ::WEBrick::HTTPServer.class_eval do
199
- # def access_log(config, req, res); end
200
- # end
201
- # ::WEBrick::BasicLog.class_eval do
202
- # def log(level, data); end
203
- # end
204
-
205
- # Rack::Server.start(:app => Rack::Builder.app do
206
- # use Rack::Lint
207
- # run Rack::MonetaRest.new(:store => :Memory)
208
- # end,
209
- # :environment => :none,
210
- # :server => :webrick,
211
- # :Port => 8808)
212
- # rescue Exception => ex
213
- # puts "\e[31mFailed to start Rack server - #{ex.message}\e[0m"
214
- # end
215
- # end
191
+ parallel do
192
+ begin
193
+ require 'rack'
194
+ require 'webrick'
195
+ require 'rack/moneta_rest'
196
+
197
+ # Keep webrick quiet
198
+ ::WEBrick::HTTPServer.class_eval do
199
+ def access_log(config, req, res); end
200
+ end
201
+ ::WEBrick::BasicLog.class_eval do
202
+ def log(level, data); end
203
+ end
204
+
205
+ Rack::Server.start(:app => Rack::Builder.app do
206
+ use Rack::Lint
207
+ run Rack::MonetaRest.new(:store => :Memory)
208
+ end,
209
+ :environment => :none,
210
+ :server => :webrick,
211
+ :Port => 8808)
212
+ rescue Exception => ex
213
+ puts "\e[31mFailed to start Rack server - #{ex.message}\e[0m"
214
+ end
215
+ end
216
216
 
217
217
  sleep 1 # Wait for servers
218
218
  end