moneta 1.2.0 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +418 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +27 -9
- data/CHANGES +28 -0
- data/CONTRIBUTORS +4 -2
- data/Gemfile +12 -8
- data/README.md +20 -18
- data/feature_matrix.yaml +2 -11
- data/lib/moneta.rb +9 -9
- data/lib/moneta/adapters/client.rb +56 -19
- data/lib/moneta/adapters/couch.rb +5 -0
- data/lib/moneta/adapters/mongo.rb +264 -7
- data/lib/moneta/adapters/redis.rb +5 -1
- data/lib/moneta/adapters/sequel.rb +45 -464
- data/lib/moneta/adapters/sequel/mysql.rb +66 -0
- data/lib/moneta/adapters/sequel/postgres.rb +80 -0
- data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
- data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
- data/lib/moneta/adapters/sqlite.rb +7 -7
- data/lib/moneta/builder.rb +2 -2
- data/lib/moneta/create_support.rb +21 -0
- data/lib/moneta/dbm_adapter.rb +31 -0
- data/lib/moneta/{mixins.rb → defaults.rb} +1 -302
- data/lib/moneta/each_key_support.rb +27 -0
- data/lib/moneta/expires_support.rb +60 -0
- data/lib/moneta/hash_adapter.rb +68 -0
- data/lib/moneta/increment_support.rb +16 -0
- data/lib/moneta/lock.rb +6 -1
- data/lib/moneta/nil_values.rb +35 -0
- data/lib/moneta/option_support.rb +51 -0
- data/lib/moneta/pool.rb +38 -6
- data/lib/moneta/proxy.rb +1 -1
- data/lib/moneta/server.rb +215 -61
- data/lib/moneta/shared.rb +13 -7
- data/lib/moneta/transformer.rb +50 -8
- data/lib/moneta/transformer/config.rb +59 -40
- data/lib/moneta/transformer/helper.rb +2 -2
- data/lib/moneta/transformer/helper/bson.rb +5 -15
- data/lib/moneta/version.rb +1 -1
- data/lib/rack/cache/moneta.rb +14 -15
- data/moneta.gemspec +14 -8
- data/script/benchmarks +7 -3
- data/script/contributors +11 -6
- data/script/start-couchdb +27 -0
- data/script/start-hbase +2 -2
- data/script/start-services +3 -3
- data/spec/active_support/cache_moneta_store_spec.rb +37 -39
- data/spec/features/concurrent_increment.rb +2 -3
- data/spec/features/create_expires.rb +15 -15
- data/spec/features/default_expires.rb +11 -12
- data/spec/features/expires.rb +215 -210
- data/spec/features/store.rb +3 -3
- data/spec/helper.rb +33 -41
- data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
- data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
- data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +6 -3
- data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +6 -3
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
- data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
- data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
- data/spec/moneta/adapters/client/client_helper.rb +24 -0
- data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
- data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
- data/spec/moneta/adapters/couch/adapter_couch_spec.rb +1 -1
- data/spec/moneta/adapters/couch/standard_couch_spec.rb +2 -2
- data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
- data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
- data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
- data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
- data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
- data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
- data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
- data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
- data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
- data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
- data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
- data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
- data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +32 -2
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +6 -4
- data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
- data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
- data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
- data/spec/moneta/adapters/redis/standard_redis_spec.rb +9 -2
- data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
- data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +11 -38
- data/spec/moneta/adapters/sequel/helper.rb +42 -0
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +6 -12
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +9 -10
- data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +2 -2
- data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
- data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
- data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
- data/spec/moneta/builder_spec.rb +22 -0
- data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
- data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
- data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
- data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
- data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
- data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
- data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
- data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
- data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
- data/spec/restserver.rb +15 -0
- metadata +47 -66
- data/.travis.yml +0 -140
- data/lib/moneta/adapters/mongo/base.rb +0 -103
- data/lib/moneta/adapters/mongo/moped.rb +0 -163
- data/lib/moneta/adapters/mongo/official.rb +0 -156
- data/script/reconfigure-couchdb +0 -13
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
- data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
- data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
- data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
- data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
- data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
- data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
- 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 <
|
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', '>=
|
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', '
|
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.
|
40
|
-
gem 'mongo', '
|
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: :
|
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', '~>
|
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://
|
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 [
|
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: <
|
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
|
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
|
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:#
|
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
|
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 [
|
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
|
919
|
-
|
920
|
-
|
921
|
-
|
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
|
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/
|
9
|
-
autoload :
|
10
|
-
autoload :
|
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/
|
13
|
+
autoload :ExpiresSupport, 'moneta/expires_support'
|
13
14
|
autoload :Expires, 'moneta/expires'
|
14
15
|
autoload :Fallback, 'moneta/fallback'
|
15
|
-
autoload :HashAdapter, 'moneta/
|
16
|
-
autoload :IncrementSupport, 'moneta/
|
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/
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
57
|
+
read_msg
|
58
58
|
end
|
59
59
|
|
60
60
|
# (see Proxy#clear)
|
61
61
|
def clear(options = {})
|
62
62
|
write(:clear, options)
|
63
|
-
|
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
|
-
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|