moneta 1.2.0 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +418 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +27 -9
  5. data/CHANGES +28 -0
  6. data/CONTRIBUTORS +4 -2
  7. data/Gemfile +12 -8
  8. data/README.md +20 -18
  9. data/feature_matrix.yaml +2 -11
  10. data/lib/moneta.rb +9 -9
  11. data/lib/moneta/adapters/client.rb +56 -19
  12. data/lib/moneta/adapters/couch.rb +5 -0
  13. data/lib/moneta/adapters/mongo.rb +264 -7
  14. data/lib/moneta/adapters/redis.rb +5 -1
  15. data/lib/moneta/adapters/sequel.rb +45 -464
  16. data/lib/moneta/adapters/sequel/mysql.rb +66 -0
  17. data/lib/moneta/adapters/sequel/postgres.rb +80 -0
  18. data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
  19. data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
  20. data/lib/moneta/adapters/sqlite.rb +7 -7
  21. data/lib/moneta/builder.rb +2 -2
  22. data/lib/moneta/create_support.rb +21 -0
  23. data/lib/moneta/dbm_adapter.rb +31 -0
  24. data/lib/moneta/{mixins.rb → defaults.rb} +1 -302
  25. data/lib/moneta/each_key_support.rb +27 -0
  26. data/lib/moneta/expires_support.rb +60 -0
  27. data/lib/moneta/hash_adapter.rb +68 -0
  28. data/lib/moneta/increment_support.rb +16 -0
  29. data/lib/moneta/lock.rb +6 -1
  30. data/lib/moneta/nil_values.rb +35 -0
  31. data/lib/moneta/option_support.rb +51 -0
  32. data/lib/moneta/pool.rb +38 -6
  33. data/lib/moneta/proxy.rb +1 -1
  34. data/lib/moneta/server.rb +215 -61
  35. data/lib/moneta/shared.rb +13 -7
  36. data/lib/moneta/transformer.rb +50 -8
  37. data/lib/moneta/transformer/config.rb +59 -40
  38. data/lib/moneta/transformer/helper.rb +2 -2
  39. data/lib/moneta/transformer/helper/bson.rb +5 -15
  40. data/lib/moneta/version.rb +1 -1
  41. data/lib/rack/cache/moneta.rb +14 -15
  42. data/moneta.gemspec +14 -8
  43. data/script/benchmarks +7 -3
  44. data/script/contributors +11 -6
  45. data/script/start-couchdb +27 -0
  46. data/script/start-hbase +2 -2
  47. data/script/start-services +3 -3
  48. data/spec/active_support/cache_moneta_store_spec.rb +37 -39
  49. data/spec/features/concurrent_increment.rb +2 -3
  50. data/spec/features/create_expires.rb +15 -15
  51. data/spec/features/default_expires.rb +11 -12
  52. data/spec/features/expires.rb +215 -210
  53. data/spec/features/store.rb +3 -3
  54. data/spec/helper.rb +33 -41
  55. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
  56. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
  57. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +6 -3
  58. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +6 -3
  59. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
  60. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
  61. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  62. data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
  63. data/spec/moneta/adapters/client/client_helper.rb +24 -0
  64. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
  65. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
  66. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +1 -1
  67. data/spec/moneta/adapters/couch/standard_couch_spec.rb +2 -2
  68. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +2 -2
  69. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
  70. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
  71. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
  72. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
  73. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
  74. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
  75. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
  76. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
  77. data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
  78. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
  79. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
  80. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
  81. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
  82. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
  83. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
  84. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
  85. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
  86. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
  87. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
  88. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
  89. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
  90. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
  91. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
  92. data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
  93. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
  94. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
  95. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
  96. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
  97. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
  98. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
  99. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
  100. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +32 -2
  101. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +6 -4
  102. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
  103. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
  104. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
  105. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
  106. data/spec/moneta/adapters/redis/standard_redis_spec.rb +9 -2
  107. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
  108. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
  109. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +11 -38
  110. data/spec/moneta/adapters/sequel/helper.rb +42 -0
  111. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +6 -12
  112. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +9 -10
  113. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
  114. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +2 -2
  115. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +2 -2
  116. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
  117. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
  118. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
  119. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
  120. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
  121. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
  122. data/spec/moneta/builder_spec.rb +22 -0
  123. data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
  124. data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
  125. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
  126. data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
  127. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
  128. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
  129. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
  130. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
  131. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
  132. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
  133. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
  134. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
  135. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
  136. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
  137. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
  138. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
  139. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
  140. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
  141. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
  142. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
  143. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
  144. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
  145. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
  146. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
  147. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
  148. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
  149. data/spec/restserver.rb +15 -0
  150. metadata +47 -66
  151. data/.travis.yml +0 -140
  152. data/lib/moneta/adapters/mongo/base.rb +0 -103
  153. data/lib/moneta/adapters/mongo/moped.rb +0 -163
  154. data/lib/moneta/adapters/mongo/official.rb +0 -156
  155. data/script/reconfigure-couchdb +0 -13
  156. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
  157. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
  158. data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
  159. data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
  160. data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
  161. data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
  162. data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
  163. data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
  164. data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
  165. data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
  166. data/spec/quality_spec.rb +0 -51
data/CHANGES CHANGED
@@ -1,3 +1,31 @@
1
+ 1.4.2
2
+
3
+ * Pool - fix busy-loop issue (#197)
4
+
5
+ 1.4.1
6
+
7
+ * Adapters::Mongo - deprecate :db option, document :database option (#194)
8
+ * Adapters::Mongo - add retries to increment operation
9
+
10
+ 1.4.0
11
+
12
+ * Adapters::Mongo - drop support for moped gem (#182)
13
+ * Adapters::Redis - use #exists? where available (#189)
14
+ * Some reorganisation of code into more separate files (#177)
15
+
16
+ 1.3.0
17
+
18
+ * Transformer - add :each_key support (#170)
19
+ * Server - add :each_key support, use non-blocking IO (#165)
20
+ * Builder - dup options before passing to adapter/proxy (#174)
21
+ * Adapter::Couch - add HTTP basic auth support
22
+ * Support MRI 2.7.0 (#172)
23
+ * Minimum required MRI version is now 2.3.0 (#172)
24
+
25
+ 1.2.1
26
+
27
+ * Transformer - fix :escape transformer deserialize implementation (#168)
28
+
1
29
  1.2.0
2
30
 
3
31
  * Adapters::Sequel - fix for compatibility with new version of JDBC SQLite
data/CONTRIBUTORS CHANGED
@@ -1,12 +1,12 @@
1
1
  Adrian Madrid <aemadrid@gmail.com>
2
- Alastair Pharo <asppsa@gmail.com>
2
+ Alastair Pharo <me@asph.dev>
3
3
  Alejandro Crosa <acrosa@sharing.local>
4
4
  Alessio Signorini <alessio@signorini.us>
5
5
  Anthony Eden <anthonyeden@gmail.com>
6
6
  Atoxhybrid <atoxhybrid@gmail.com>
7
7
  AtoxIO <atoxhybrid@gmail.com>
8
- Benjamin Yu <benjaminlyu@gmail.com>
9
8
  Ben Schwarz <ben.schwarz@gmail.com>
9
+ Benjamin Yu <benjaminlyu@gmail.com>
10
10
  Daniel Mendler <mail@daniel-mendler.de>
11
11
  Denis Defreyne <denis.defreyne@stoneship.org>
12
12
  Derek Kastner <dkastner@gmail.com>
@@ -18,12 +18,14 @@ Jari Bakken <jari.bakken@gmail.com>
18
18
  Jay Mitchell <jaybmitchell@gmail.com>
19
19
  Jeremy Voorhis <jvoorhis@gmail.com>
20
20
  Jon Crosby <jon@joncrosby.me>
21
+ Jonathan Gnagy <jonathan.l.gnagy@sherwin.com>
21
22
  lakshan <lakshan@web2media.net>
22
23
  Mal McKay <mal.mckay@gmail.com>
23
24
  Marek Skrobacki <skrobul@skrobul.com>
24
25
  Mauro Asprea <mauroasprea@gmail.com>
25
26
  Nathaniel Bibler <git@nathanielbibler.com>
26
27
  Olle Jonsson <olle.jonsson@gmail.com>
28
+ Orien Madgwick <_@orien.io>
27
29
  Patrik Rak <patrik@raxoft.cz>
28
30
  Piotr Murach <pmurach@gmail.com>
29
31
  Potapov Sergey <blake131313@gmail.com>
data/Gemfile CHANGED
@@ -14,7 +14,7 @@ gem 'bert', platforms: :ruby, group: :bert
14
14
  gem 'php-serialize', group: :php
15
15
 
16
16
  group :bson do
17
- gem 'bson', '>= 2.0.0'
17
+ gem 'bson', '>= 4.0.0'
18
18
  end
19
19
 
20
20
  group :msgpack do
@@ -23,7 +23,7 @@ group :msgpack do
23
23
  end
24
24
 
25
25
  # Compressors used by Transformer
26
- gem 'rbzip2', '~> 0.3.0', group: :bzip2
26
+ gem 'rbzip2', '>= 0.3.0', group: :bzip2
27
27
  gem 'lz4-ruby', platforms: :ruby, group: :lz4
28
28
  gem 'ruby-lzma', platforms: :ruby, group: :lzma
29
29
  gem 'lzoruby', platforms: :ruby, group: :lzo
@@ -36,9 +36,8 @@ gem 'cityhash', platforms: :ruby, group: :city
36
36
  # Backends
37
37
  gem 'daybreak', group: :daybreak
38
38
  gem 'activerecord', '~> 5.2', group: :activerecord
39
- gem 'redis', '~> 4.0.0', group: :redis
40
- gem 'mongo', '~> 2.1.0', group: :mongo_official
41
- gem 'moped', '>= 2.0.0', group: :mongo_moped
39
+ gem 'redis', '~> 4.2', group: :redis
40
+ gem 'mongo', '>= 2', group: :mongo_official
42
41
  gem 'sequel', group: :sequel
43
42
  gem 'dalli', group: :memcached_dalli
44
43
  gem 'riak-client', group: :riak
@@ -50,7 +49,7 @@ gem 'tdb', platforms: :ruby, group: :tdb
50
49
  gem 'leveldb-ruby', platforms: :ruby, group: :leveldb
51
50
  gem 'lmdb', platforms: :mri, group: :lmdb
52
51
  gem 'tokyocabinet', platforms: :ruby, group: :tokyocabinet
53
- gem 'kyotocabinet-ruby-reanimated', platforms: :ruby, group: :kyotocabinet
52
+ gem 'kyotocabinet-ruby-reanimated', platforms: [:ruby_23, :ruby_24, :ruby_25, :ruby_26], group: :kyotocabinet
54
53
  gem 'memcached', platforms: :ruby, group: :memcached_native
55
54
  gem 'jruby-memcached', platforms: :jruby, group: :memcached_native
56
55
  gem 'activerecord-jdbch2-adapter', platforms: :jruby, group: :h2, github: 'jruby/activerecord-jdbc-adapter', glob: 'activerecord-jdbch2-adapter/*.gemspec', branch: '52-stable'
@@ -94,12 +93,17 @@ end
94
93
 
95
94
  # Rails integration testing
96
95
  group :rails do
97
- gem 'actionpack', '~> 5.0'
96
+ gem 'actionpack', '~> 5.2.0'
98
97
  gem 'minitest', '~> 5.0'
99
98
  end
100
99
 
101
100
  # Used for generating the feature matrix
102
101
  group :doc, optional: true do
103
- gem 'kramdown', '~> 1.17.0'
102
+ gem 'kramdown', '~> 2.3.0'
104
103
  gem 'yard', '~> 0.9.20'
105
104
  end
105
+
106
+ # Used for running a dev console
107
+ group :console, optional: true do
108
+ gem 'irb'
109
+ end
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Moneta: A unified interface for key/value stores
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/moneta.svg)](http://rubygems.org/gems/moneta)
4
- [![Build Status](https://secure.travis-ci.org/moneta-rb/moneta.svg?branch=master)](http://travis-ci.org/moneta-rb/moneta)
4
+ [![Build Status](https://github.com/moneta-rb/moneta/actions/workflows/ruby.yml/badge.svg)](https://github.com/moneta-rb/moneta/actions/workflows/ruby.yml)
5
5
  [![Code Climate](https://codeclimate.com/github/moneta-rb/moneta.svg)](https://codeclimate.com/github/moneta-rb/moneta)
6
6
  [![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=min4d&url=https://github.com/moneta-rb/moneta&title=Moneta&language=&tags=github&category=software)
7
7
 
@@ -32,7 +32,7 @@ same for template languages.
32
32
  * Give people a starting point or example code to start working with their favourite key/value store. Feel free to copy code, please mention Moneta then :)
33
33
  * Create a reusable piece of code, since similar things are solved over and over again ([Rails](http://rubyonrails.org/) brings its own cache stores, and many frameworks do the same...)
34
34
 
35
- Moneta is tested thoroughly using [Travis-CI](http://travis-ci.org/moneta-rb/moneta).
35
+ Moneta is tested thoroughly using [GitHub Actions](https://github.com/moneta-rb/moneta/actions).
36
36
 
37
37
  ------
38
38
 
@@ -74,7 +74,7 @@ store.close
74
74
 
75
75
  * Source: <http://github.com/moneta-rb/moneta>
76
76
  * Bugs: <http://github.com/moneta-rb/moneta/issues>
77
- * Tests and benchmarks: <http://travis-ci.org/moneta-rb/moneta>
77
+ * Tests and benchmarks: <https://github.com/moneta-rb/moneta/actions>
78
78
  * API documentation:
79
79
  * Latest Gem: <http://rubydoc.info/gems/moneta/frames>
80
80
  * GitHub master: <http://rubydoc.info/github/moneta-rb/moneta/master/frames>
@@ -120,7 +120,7 @@ Out of the box, it supports the following backends. Use the backend name symbol
120
120
  * [Simple Samba database TDB](http://tdb.samba.org/) (`:TDB`)
121
121
  * Document databases:
122
122
  * [CouchDB](http://couchdb.apache.org/) (`:Couch`)
123
- * [MongoDB](http://www.mongodb.org/) (`:Mongo`, `:MongoOffical` or `:MongoMoped`)
123
+ * [MongoDB](http://www.mongodb.org/) (`:Mongo`)
124
124
  * Moneta network protocols:
125
125
  * Moneta key/value client (`:Client` works with `Moneta::Server`)
126
126
  * Moneta HTTP/REST client (`:RestClient` works with `Rack::MonetaRest`)
@@ -142,11 +142,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
142
142
 
143
143
  <tr><th colspan="2">Persistent stores</th><th colspan="12"></th></tr>
144
144
 
145
- <tr><td>Mongo</td><td>mongo or moped</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:#5F5">✓</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:#5F5">✓</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><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
146
-
147
- <tr><td>MongoOfficial</td><td>mongo</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:#5F5">✓</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:#5F5">✓</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><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
148
-
149
- <tr><td>MongoMoped</td><td>moped</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:#5F5">✓</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:#5F5">✓</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><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
145
+ <tr><td>Mongo</td><td>mongo</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:#5F5">✓</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:#5F5">✓</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><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
150
146
 
151
147
  <tr><td>Redis</td><td>redis</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:#5F5">✓</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:#5F5">✓</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><a href="http://redis.io/">Redis</a> database</td></tr>
152
148
 
@@ -214,7 +210,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
214
210
 
215
211
  <tr><th colspan="2">Network clients</th><th colspan="12"></th></tr>
216
212
 
217
- <tr><td>Client</td><td>-</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:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></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>Moneta client adapter</td></tr>
213
+ <tr><td>Client</td><td>-</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:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>Moneta client adapter</td></tr>
218
214
 
219
215
  <tr><td>RestClient</td><td>-</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:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">?<sup>13</sup></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>Moneta REST client adapter</td></tr>
220
216
 
@@ -225,7 +221,9 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
225
221
  3. Share a Moneta store between multiple processes using `Moneta::Shared` (See below).
226
222
  4. If a store provides atomic increment it can be used with `Moneta::Semaphore`. You can add weak `#increment` support using the `Moneta::WeakIncrement` proxy.
227
223
  5. If a store provides atomic creation it can be used with `Moneta::Mutex`. You can add weak `#create` support using the `Moneta::WeakCreate` proxy.
228
- 6. Add expiration support by using `Moneta::Expires` or by passing the option `expires: true` to `Moneta#new`.
224
+ 6. Add expiration support by using `Moneta::Expires` or by passing the option
225
+ `expires: true` (or `expires: <seconds>` if you want all values to expire by
226
+ default) to `Moneta#new`.
229
227
  7. This indicates that there is some performance gain when fetching multiple values at once using `#values_at`/`#fetch_values` or `#slice`. For instance, the `MGET` instruction in Redis, or the ability to retrieve several rows in one query in SQL.
230
228
  8. This indicates that there is some performance gain when storing multiple key/value pairs at once using `#merge!`/`#update`.
231
229
  9. Sqlite/YAML/PStore are multiprocess safe, but the performance suffers badly since the whole database file must be locked for writing. Use a key/value server if you want multiprocess concurrency!
@@ -913,12 +911,16 @@ Person.adapter :memory, Moneta.new(:Redis)
913
911
 
914
912
  ## Testing and Benchmarks
915
913
 
916
- Testing is done using [Travis-CI](http://travis-ci.org/moneta-rb/moneta). Currently we support MRI Ruby >= 2.2.2 and JRuby 9.2.x.
914
+ Testing is done using [GitHub Actions](https://github.com/moneta-rb/moneta/actions).
915
+ Currently we support MRI Ruby >= 2.3.0 and the JRuby >= 9.2.9.0.
917
916
 
918
- Benchmarks for each store are done on [Travis-CI](http://travis-ci.org/moneta-rb/moneta) for each build. Take a look there
919
- to compare the speed of the different key value stores for different key/value sizes and size distributions.
920
- Feel free to add your own configurations! The impact of Moneta should be minimal since it is only a thin layer
921
- on top of the different stores.
917
+ ~~Benchmarks for each store are done on
918
+ [Travis-CI](http://travis-ci.org/moneta-rb/moneta) for each build.~~ At the
919
+ time of writing, benchmarks still need to be migrated from Travis to GitHub
920
+ Actions. Take a look there to compare the speed of the different key value
921
+ stores for different key/value sizes and size distributions. Feel free to add
922
+ your own configurations! The impact of Moneta should be minimal since it is
923
+ only a thin layer on top of the different stores.
922
924
 
923
925
 
924
926
  ------
@@ -938,8 +940,8 @@ If you want support for another adapter you can at first at it to the list of
938
940
  missing adapters at https://github.com/moneta-rb/moneta/issues/16
939
941
 
940
942
  If you choose to implement an adapter please also add tests. Please check also
941
- if travis.yml needs changes, for example if you need to start additional
942
- services.
943
+ if anything in `.github/workflows` needs changes, for example if you need to
944
+ start additional services.
943
945
 
944
946
  Check if the default settings in Moneta#new are appropriate for your adapter. If
945
947
  not specify a better one.
data/feature_matrix.yaml CHANGED
@@ -8,20 +8,10 @@ notes:
8
8
  server if you want multiprocess concurrency!
9
9
  backends:
10
10
  - adapter: Mongo
11
- platforms: [ MRI, JRuby ]
12
- gems: mongo or moped
13
- features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
14
- description: "[MongoDB](http://www.mongodb.org/) database"
15
- - adapter: MongoOfficial
16
11
  platforms: [ MRI, JRuby ]
17
12
  gems: mongo
18
13
  features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
19
14
  description: "[MongoDB](http://www.mongodb.org/) database"
20
- - adapter: MongoMoped
21
- platforms: [ MRI, JRuby ]
22
- gems: moped
23
- features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
24
- description: "[MongoDB](http://www.mongodb.org/) database"
25
15
  - adapter: Redis
26
16
  platforms: [ MRI, JRuby ]
27
17
  gems: redis
@@ -220,13 +210,14 @@ backends:
220
210
  - adapter: Client
221
211
  platforms: [ MRI, JRuby ]
222
212
  features: [multiprocess]
223
- unknown: [ increment, create, expires, persist ]
213
+ unknown: [ increment, create, expires, persist, each_key ]
224
214
  description: "Moneta client adapter"
225
215
  notes:
226
216
  increment: depends on server
227
217
  create: depends on server
228
218
  expires: depends on server
229
219
  persist: depends on server
220
+ each_key: depends on server
230
221
  - adapter: RestClient
231
222
  platforms: [ MRI, JRuby ]
232
223
  features: [ multiprocess ]
data/lib/moneta.rb CHANGED
@@ -5,20 +5,22 @@
5
5
  module Moneta
6
6
  autoload :Builder, 'moneta/builder'
7
7
  autoload :Cache, 'moneta/cache'
8
- autoload :CreateSupport, 'moneta/mixins'
9
- autoload :Defaults, 'moneta/mixins'
10
- autoload :EachKeySupport, 'moneta/mixins'
8
+ autoload :CreateSupport, 'moneta/create_support'
9
+ autoload :DBMAdapter, 'moneta/dbm_adapter'
10
+ autoload :Defaults, 'moneta/defaults'
11
+ autoload :EachKeySupport, 'moneta/each_key_support'
11
12
  autoload :Enumerable, 'moneta/enumerable'
12
- autoload :ExpiresSupport, 'moneta/mixins'
13
+ autoload :ExpiresSupport, 'moneta/expires_support'
13
14
  autoload :Expires, 'moneta/expires'
14
15
  autoload :Fallback, 'moneta/fallback'
15
- autoload :HashAdapter, 'moneta/mixins'
16
- autoload :IncrementSupport, 'moneta/mixins'
16
+ autoload :HashAdapter, 'moneta/hash_adapter'
17
+ autoload :IncrementSupport, 'moneta/increment_support'
17
18
  autoload :Lock, 'moneta/lock'
18
19
  autoload :Logger, 'moneta/logger'
19
20
  autoload :Mutex, 'moneta/synchronize'
21
+ autoload :NilValues, 'moneta/nil_values'
20
22
  autoload :OptionMerger, 'moneta/optionmerger'
21
- autoload :OptionSupport, 'moneta/mixins'
23
+ autoload :OptionSupport, 'moneta/option_support'
22
24
  autoload :Pool, 'moneta/pool'
23
25
  autoload :Proxy, 'moneta/proxy'
24
26
  autoload :Semaphore, 'moneta/synchronize'
@@ -58,8 +60,6 @@ module Moneta
58
60
  autoload :MemcachedNative, 'moneta/adapters/memcached/native'
59
61
  autoload :Memory, 'moneta/adapters/memory'
60
62
  autoload :Mongo, 'moneta/adapters/mongo'
61
- autoload :MongoMoped, 'moneta/adapters/mongo/moped'
62
- autoload :MongoOfficial, 'moneta/adapters/mongo/official'
63
63
  autoload :Null, 'moneta/adapters/null'
64
64
  autoload :PStore, 'moneta/adapters/pstore'
65
65
  autoload :Redis, 'moneta/adapters/redis'
@@ -23,44 +23,44 @@ module Moneta
23
23
  # (see Proxy#key?)
24
24
  def key?(key, options = {})
25
25
  write(:key?, key, options)
26
- read
26
+ read_msg
27
27
  end
28
28
 
29
29
  # (see Proxy#load)
30
30
  def load(key, options = {})
31
31
  write(:load, key, options)
32
- read
32
+ read_msg
33
33
  end
34
34
 
35
35
  # (see Proxy#store)
36
36
  def store(key, value, options = {})
37
37
  write(:store, key, value, options)
38
- read
38
+ read_msg
39
39
  value
40
40
  end
41
41
 
42
42
  # (see Proxy#delete)
43
43
  def delete(key, options = {})
44
44
  write(:delete, key, options)
45
- read
45
+ read_msg
46
46
  end
47
47
 
48
48
  # (see Proxy#increment)
49
49
  def increment(key, amount = 1, options = {})
50
50
  write(:increment, key, amount, options)
51
- read
51
+ read_msg
52
52
  end
53
53
 
54
54
  # (see Proxy#create)
55
55
  def create(key, value, options = {})
56
56
  write(:create, key, value, options)
57
- read
57
+ read_msg
58
58
  end
59
59
 
60
60
  # (see Proxy#clear)
61
61
  def clear(options = {})
62
62
  write(:clear, options)
63
- read
63
+ read_msg
64
64
  self
65
65
  end
66
66
 
@@ -70,12 +70,43 @@ module Moneta
70
70
  nil
71
71
  end
72
72
 
73
+ # (see Proxy#each_key)
74
+ def each_key
75
+ raise NotImplementedError, 'each_key is not supported' unless supports?(:each_key)
76
+ return enum_for(:each_key) unless block_given?
77
+
78
+ begin
79
+ write(:each_key)
80
+ yield_break = false
81
+
82
+ loop do
83
+ write('NEXT')
84
+
85
+ # A StopIteration error will be raised by this call if the server
86
+ # reached the end of the enumeration. This will stop the loop
87
+ # automatically.
88
+ result = read_msg
89
+
90
+ # yield_break will be true in the ensure block (below) if anything
91
+ # happened during the yield to stop further enumeration.
92
+ yield_break = true
93
+ yield result
94
+ yield_break = false
95
+ end
96
+ ensure
97
+ write('BREAK') if yield_break
98
+ read_msg # nil return from each_key
99
+ end
100
+
101
+ self
102
+ end
103
+
73
104
  # (see Default#features)
74
105
  def features
75
106
  @features ||=
76
107
  begin
77
108
  write(:features)
78
- read.freeze
109
+ read_msg.freeze
79
110
  end
80
111
  end
81
112
 
@@ -86,18 +117,24 @@ module Moneta
86
117
  @socket.write([s.bytesize].pack('N') << s)
87
118
  end
88
119
 
89
- def read
90
- size = @socket
91
- .recv(4).tap do |bytes|
92
- raise EOFError, 'failed to read size' unless bytes.bytesize == 4
93
- end
94
- .unpack('N')
95
- .first
96
-
97
- result = Marshal.load(@socket.recv(size).tap do |bytes|
98
- raise EOFError, 'Not enough bytes read' unless bytes.bytesize == size
99
- end)
120
+ # JRuby doesn't support socket#recv with flags
121
+ if defined?(JRUBY_VERSION)
122
+ def read(bytes)
123
+ received = @socket.read(bytes)
124
+ raise EOFError, "Server closed socket" unless received && received.bytesize == bytes
125
+ received
126
+ end
127
+ else
128
+ def read(bytes)
129
+ received = @socket.recv(bytes, Socket::MSG_WAITALL)
130
+ raise EOFError, "Server closed socket" unless received && received.bytesize == bytes
131
+ received
132
+ end
133
+ end
100
134
 
135
+ def read_msg
136
+ size = read(4).unpack('N').first
137
+ result = Marshal.load(read(size))
101
138
  raise result if Exception === result
102
139
  result
103
140
  end
@@ -39,6 +39,8 @@ module Moneta
39
39
  # @option options [String] :scheme ('http') HTTP scheme to use
40
40
  # @option options [String] :value_field ('value') Document field to store value
41
41
  # @option options [String] :type_field ('type') Document field to store value type
42
+ # @option options [String] :login Login name to use for HTTP basic authentication
43
+ # @option options [String] :password Password to use for HTTP basic authentication
42
44
  # @option options [Symbol] :adapter Adapter to use with Faraday
43
45
  # @option options [Faraday::Connecton] :backend Use existing backend instance
44
46
  # @option options Other options passed to {Faraday::new} (unless
@@ -46,6 +48,8 @@ module Moneta
46
48
  def initialize(options = {})
47
49
  @value_field = options.delete(:value_field) || 'value'
48
50
  @type_field = options.delete(:type_field) || 'type'
51
+ login = options.delete(:login)
52
+ password = options.delete(:password)
49
53
  @backend = options.delete(:backend) || begin
50
54
  host = options.delete(:host) || '127.0.0.1'
51
55
  port = options.delete(:port) || 5984
@@ -56,6 +60,7 @@ module Moneta
56
60
  end
57
61
  ::Faraday.new("#{scheme}://#{host}:#{port}/#{db}", options, &block)
58
62
  end
63
+ @backend.basic_auth(login, password) if login && password
59
64
  @rev_cache = Moneta.build do
60
65
  use :Lock
61
66
  adapter :LRUHash