moneta 0.7.20 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -5
  3. data/CHANGES +6 -0
  4. data/CONTRIBUTORS +2 -0
  5. data/Gemfile +31 -44
  6. data/LICENSE +1 -1
  7. data/README.md +82 -59
  8. data/lib/active_support/cache/moneta_store.rb +3 -3
  9. data/lib/moneta.rb +4 -2
  10. data/lib/moneta/adapters/activerecord.rb +8 -8
  11. data/lib/moneta/adapters/cassandra.rb +8 -8
  12. data/lib/moneta/adapters/couch.rb +1 -1
  13. data/lib/moneta/adapters/datamapper.rb +5 -5
  14. data/lib/moneta/adapters/daybreak.rb +1 -1
  15. data/lib/moneta/adapters/fog.rb +2 -2
  16. data/lib/moneta/adapters/lmdb.rb +1 -1
  17. data/lib/moneta/adapters/localmemcache.rb +1 -1
  18. data/lib/moneta/adapters/memcached/dalli.rb +3 -3
  19. data/lib/moneta/adapters/memcached/native.rb +1 -1
  20. data/lib/moneta/adapters/mongo.rb +6 -164
  21. data/lib/moneta/adapters/mongo/base.rb +63 -0
  22. data/lib/moneta/adapters/mongo/moped.rb +113 -0
  23. data/lib/moneta/adapters/mongo/official.rb +121 -0
  24. data/lib/moneta/adapters/pstore.rb +1 -5
  25. data/lib/moneta/adapters/restclient.rb +1 -1
  26. data/lib/moneta/adapters/sequel.rb +10 -10
  27. data/lib/moneta/cache.rb +1 -1
  28. data/lib/moneta/logger.rb +2 -2
  29. data/lib/moneta/mixins.rb +4 -4
  30. data/lib/moneta/shared.rb +2 -2
  31. data/lib/moneta/stack.rb +2 -2
  32. data/lib/moneta/synchronize.rb +2 -2
  33. data/lib/moneta/transformer.rb +5 -5
  34. data/lib/moneta/transformer/config.rb +38 -40
  35. data/lib/moneta/version.rb +1 -1
  36. data/lib/rack/cache/moneta.rb +1 -1
  37. data/lib/rack/moneta_cookies.rb +2 -2
  38. data/lib/rack/moneta_rest.rb +1 -1
  39. data/lib/rack/moneta_store.rb +4 -4
  40. data/lib/rack/session/moneta.rb +14 -2
  41. data/moneta.gemspec +1 -0
  42. data/script/benchmarks +97 -96
  43. data/script/generate-specs +763 -730
  44. data/script/install-bundle +1 -1
  45. data/script/install-kyotocabinet +2 -2
  46. data/script/memusage +1 -1
  47. data/script/upload-bundle +1 -1
  48. data/spec/action_dispatch/session_moneta_store_spec.rb +5 -5
  49. data/spec/active_support/cache_moneta_store_spec.rb +20 -20
  50. data/spec/moneta/adapter_activerecord_exisiting_connection_spec.rb +2 -2
  51. data/spec/moneta/adapter_activerecord_spec.rb +6 -6
  52. data/spec/moneta/adapter_cassandra_spec.rb +1 -1
  53. data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +1 -1
  54. data/spec/moneta/adapter_couch_spec.rb +1 -1
  55. data/spec/moneta/adapter_datamapper_spec.rb +6 -6
  56. data/spec/moneta/adapter_daybreak_spec.rb +1 -1
  57. data/spec/moneta/adapter_dbm_spec.rb +1 -1
  58. data/spec/moneta/adapter_file_spec.rb +1 -1
  59. data/spec/moneta/adapter_fog_spec.rb +4 -4
  60. data/spec/moneta/adapter_gdbm_spec.rb +1 -1
  61. data/spec/moneta/adapter_hbase_spec.rb +1 -1
  62. data/spec/moneta/adapter_kyotocabinet_spec.rb +1 -1
  63. data/spec/moneta/adapter_leveldb_spec.rb +1 -1
  64. data/spec/moneta/adapter_lmdb_spec.rb +1 -1
  65. data/spec/moneta/adapter_lmdb_with_db_spec.rb +1 -1
  66. data/spec/moneta/adapter_localmemcache_spec.rb +1 -1
  67. data/spec/moneta/adapter_lruhash_spec.rb +1 -1
  68. data/spec/moneta/adapter_memcached_dalli_spec.rb +1 -1
  69. data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
  70. data/spec/moneta/adapter_memcached_native_spec.rb +1 -1
  71. data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +1 -1
  72. data/spec/moneta/adapter_memcached_spec.rb +1 -1
  73. data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +1 -1
  74. data/spec/moneta/adapter_mongo_moped_spec.rb +56 -0
  75. data/spec/moneta/adapter_mongo_moped_with_default_expires_spec.rb +51 -0
  76. data/spec/moneta/adapter_mongo_official_spec.rb +56 -0
  77. data/spec/moneta/adapter_mongo_official_with_default_expires_spec.rb +51 -0
  78. data/spec/moneta/adapter_mongo_spec.rb +1 -7
  79. data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +1 -1
  80. data/spec/moneta/adapter_pstore_spec.rb +1 -1
  81. data/spec/moneta/adapter_redis_with_default_expires_spec.rb +1 -1
  82. data/spec/moneta/adapter_restclient_spec.rb +1 -1
  83. data/spec/moneta/adapter_sdbm_spec.rb +1 -1
  84. data/spec/moneta/adapter_sequel_spec.rb +1 -1
  85. data/spec/moneta/adapter_sqlite_spec.rb +1 -1
  86. data/spec/moneta/adapter_tdb_spec.rb +1 -1
  87. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +1 -1
  88. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +1 -1
  89. data/spec/moneta/adapter_yaml_spec.rb +1 -1
  90. data/spec/moneta/cache_file_memory_spec.rb +1 -1
  91. data/spec/moneta/expires_file_spec.rb +3 -3
  92. data/spec/moneta/expires_memory_with_default_expires_spec.rb +1 -1
  93. data/spec/moneta/mutex_spec.rb +1 -1
  94. data/spec/moneta/optionmerger_spec.rb +26 -26
  95. data/spec/moneta/pool_spec.rb +1 -1
  96. data/spec/moneta/semaphore_spec.rb +1 -1
  97. data/spec/moneta/shared_tcp_spec.rb +2 -2
  98. data/spec/moneta/shared_unix_spec.rb +2 -2
  99. data/spec/moneta/stack_file_memory_spec.rb +1 -1
  100. data/spec/moneta/stack_memory_file_spec.rb +1 -1
  101. data/spec/moneta/standard_activerecord_spec.rb +1 -1
  102. data/spec/moneta/standard_activerecord_with_expires_spec.rb +1 -1
  103. data/spec/moneta/standard_cassandra_spec.rb +1 -1
  104. data/spec/moneta/standard_client_tcp_spec.rb +1 -1
  105. data/spec/moneta/standard_client_unix_spec.rb +2 -2
  106. data/spec/moneta/standard_couch_spec.rb +1 -1
  107. data/spec/moneta/standard_couch_with_expires_spec.rb +1 -1
  108. data/spec/moneta/standard_datamapper_spec.rb +2 -2
  109. data/spec/moneta/standard_datamapper_with_expires_spec.rb +2 -2
  110. data/spec/moneta/standard_datamapper_with_repository_spec.rb +2 -2
  111. data/spec/moneta/standard_daybreak_spec.rb +1 -1
  112. data/spec/moneta/standard_daybreak_with_expires_spec.rb +1 -1
  113. data/spec/moneta/standard_dbm_spec.rb +1 -1
  114. data/spec/moneta/standard_dbm_with_expires_spec.rb +1 -1
  115. data/spec/moneta/standard_file_spec.rb +1 -1
  116. data/spec/moneta/standard_file_with_expires_spec.rb +1 -1
  117. data/spec/moneta/standard_fog_spec.rb +4 -4
  118. data/spec/moneta/standard_fog_with_expires_spec.rb +5 -5
  119. data/spec/moneta/standard_gdbm_spec.rb +1 -1
  120. data/spec/moneta/standard_gdbm_with_expires_spec.rb +1 -1
  121. data/spec/moneta/standard_hashfile_spec.rb +1 -1
  122. data/spec/moneta/standard_hashfile_with_expires_spec.rb +1 -1
  123. data/spec/moneta/standard_hbase_spec.rb +1 -1
  124. data/spec/moneta/standard_hbase_with_expires_spec.rb +1 -1
  125. data/spec/moneta/standard_kyotocabinet_spec.rb +1 -1
  126. data/spec/moneta/standard_kyotocabinet_with_expires_spec.rb +1 -1
  127. data/spec/moneta/standard_leveldb_spec.rb +1 -1
  128. data/spec/moneta/standard_leveldb_with_expires_spec.rb +1 -1
  129. data/spec/moneta/standard_lmdb_spec.rb +1 -1
  130. data/spec/moneta/standard_lmdb_with_expires_spec.rb +1 -1
  131. data/spec/moneta/standard_localmemcache_spec.rb +1 -1
  132. data/spec/moneta/standard_localmemcache_with_expires_spec.rb +1 -1
  133. data/spec/moneta/standard_lruhash_spec.rb +1 -1
  134. data/spec/moneta/standard_lruhash_with_expires_spec.rb +1 -1
  135. data/spec/moneta/standard_memcached_dalli_spec.rb +1 -1
  136. data/spec/moneta/standard_memcached_native_spec.rb +1 -1
  137. data/spec/moneta/standard_memcached_spec.rb +1 -1
  138. data/spec/moneta/standard_memory_spec.rb +1 -1
  139. data/spec/moneta/standard_memory_with_compress_spec.rb +1 -1
  140. data/spec/moneta/standard_memory_with_expires_spec.rb +1 -1
  141. data/spec/moneta/standard_memory_with_json_key_serializer_spec.rb +1 -1
  142. data/spec/moneta/standard_memory_with_json_serializer_spec.rb +1 -1
  143. data/spec/moneta/standard_memory_with_json_value_serializer_spec.rb +1 -1
  144. data/spec/moneta/standard_memory_with_prefix_spec.rb +1 -1
  145. data/spec/moneta/standard_memory_with_snappy_compress_spec.rb +1 -1
  146. data/spec/moneta/standard_mongo_moped_spec.rb +255 -0
  147. data/spec/moneta/standard_mongo_official_spec.rb +255 -0
  148. data/spec/moneta/standard_mongo_spec.rb +1 -1
  149. data/spec/moneta/standard_null_spec.rb +1 -1
  150. data/spec/moneta/standard_pstore_spec.rb +1 -1
  151. data/spec/moneta/standard_pstore_with_expires_spec.rb +1 -1
  152. data/spec/moneta/standard_redis_spec.rb +1 -1
  153. data/spec/moneta/standard_restclient_spec.rb +1 -1
  154. data/spec/moneta/standard_riak_spec.rb +1 -1
  155. data/spec/moneta/standard_riak_with_expires_spec.rb +1 -1
  156. data/spec/moneta/standard_sdbm_spec.rb +1 -1
  157. data/spec/moneta/standard_sdbm_with_expires_spec.rb +1 -1
  158. data/spec/moneta/standard_sequel_spec.rb +1 -1
  159. data/spec/moneta/standard_sequel_with_expires_spec.rb +1 -1
  160. data/spec/moneta/standard_sqlite_spec.rb +1 -1
  161. data/spec/moneta/standard_sqlite_with_expires_spec.rb +1 -1
  162. data/spec/moneta/standard_tdb_spec.rb +1 -1
  163. data/spec/moneta/standard_tdb_with_expires_spec.rb +1 -1
  164. data/spec/moneta/standard_tokyocabinet_spec.rb +1 -1
  165. data/spec/moneta/standard_tokyocabinet_with_expires_spec.rb +1 -1
  166. data/spec/moneta/standard_tokyotyrant_spec.rb +1 -1
  167. data/spec/moneta/standard_tokyotyrant_with_expires_spec.rb +1 -1
  168. data/spec/moneta/standard_yaml_spec.rb +1 -1
  169. data/spec/moneta/standard_yaml_with_expires_spec.rb +1 -1
  170. data/spec/moneta/transformer_bencode_spec.rb +1 -1
  171. data/spec/moneta/transformer_bert_spec.rb +1 -1
  172. data/spec/moneta/transformer_bson_spec.rb +1 -1
  173. data/spec/moneta/transformer_bzip2_spec.rb +1 -1
  174. data/spec/moneta/transformer_json_spec.rb +1 -1
  175. data/spec/moneta/transformer_key_inspect_spec.rb +1 -1
  176. data/spec/moneta/transformer_key_marshal_spec.rb +1 -1
  177. data/spec/moneta/transformer_key_to_s_spec.rb +1 -1
  178. data/spec/moneta/transformer_key_yaml_spec.rb +1 -1
  179. data/spec/moneta/transformer_lz4_spec.rb +1 -1
  180. data/spec/moneta/transformer_lzma_spec.rb +1 -1
  181. data/spec/moneta/transformer_lzo_spec.rb +1 -1
  182. data/spec/moneta/transformer_marshal_base64_spec.rb +1 -1
  183. data/spec/moneta/transformer_marshal_city128_spec.rb +1 -1
  184. data/spec/moneta/transformer_marshal_city32_spec.rb +1 -1
  185. data/spec/moneta/transformer_marshal_city64_spec.rb +1 -1
  186. data/spec/moneta/transformer_marshal_escape_spec.rb +1 -1
  187. data/spec/moneta/transformer_marshal_hex_spec.rb +1 -1
  188. data/spec/moneta/transformer_marshal_hmac_spec.rb +1 -1
  189. data/spec/moneta/transformer_marshal_md5_spec.rb +1 -1
  190. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +1 -1
  191. data/spec/moneta/transformer_marshal_prefix_spec.rb +1 -1
  192. data/spec/moneta/transformer_marshal_qp_spec.rb +1 -1
  193. data/spec/moneta/transformer_marshal_rmd160_spec.rb +1 -1
  194. data/spec/moneta/transformer_marshal_sha1_spec.rb +1 -1
  195. data/spec/moneta/transformer_marshal_sha256_spec.rb +1 -1
  196. data/spec/moneta/transformer_marshal_sha384_spec.rb +1 -1
  197. data/spec/moneta/transformer_marshal_sha512_spec.rb +1 -1
  198. data/spec/moneta/transformer_marshal_spec.rb +1 -1
  199. data/spec/moneta/transformer_marshal_truncate_spec.rb +1 -1
  200. data/spec/moneta/transformer_marshal_uuencode_spec.rb +1 -1
  201. data/spec/moneta/transformer_msgpack_spec.rb +1 -1
  202. data/spec/moneta/transformer_ox_spec.rb +1 -1
  203. data/spec/moneta/transformer_php_spec.rb +1 -1
  204. data/spec/moneta/transformer_quicklz_spec.rb +1 -1
  205. data/spec/moneta/transformer_snappy_spec.rb +1 -1
  206. data/spec/moneta/transformer_tnet_spec.rb +1 -1
  207. data/spec/moneta/transformer_value_marshal_spec.rb +1 -1
  208. data/spec/moneta/transformer_value_yaml_spec.rb +1 -1
  209. data/spec/moneta/transformer_yaml_spec.rb +1 -1
  210. data/spec/moneta/transformer_zlib_spec.rb +1 -1
  211. data/spec/moneta/weak_create_spec.rb +4 -4
  212. data/spec/moneta/weak_increment_spec.rb +4 -4
  213. data/spec/monetaspecs.rb +481 -481
  214. metadata +14 -185
@@ -0,0 +1,113 @@
1
+ require 'moneta/adapters/mongo/base'
2
+ require 'moped'
3
+
4
+ module Moneta
5
+ module Adapters
6
+ # MongoDB backend
7
+ #
8
+ # Supports expiration, documents will be automatically removed starting
9
+ # with mongodb >= 2.2 (see {http://docs.mongodb.org/manual/tutorial/expire-data/}).
10
+ #
11
+ # You can store hashes directly using this adapter.
12
+ #
13
+ # @example Store hashes
14
+ # db = Moneta::Adapters::MongoMoped.new
15
+ # db['key'] = {a: 1, b: 2}
16
+ #
17
+ # @api public
18
+ class MongoMoped < MongoBase
19
+ # @param [Hash] options
20
+ # @option options [String] :collection ('moneta') MongoDB collection name
21
+ # @option options [String] :host ('127.0.0.1') MongoDB server host
22
+ # @option options [String] :user Username used to authenticate
23
+ # @option options [String] :password Password used to authenticate
24
+ # @option options [Integer] :port (MongoDB default port) MongoDB server port
25
+ # @option options [String] :db ('moneta') MongoDB database
26
+ # @option options [Integer] :expires Default expiration time
27
+ # @option options [String] :expires_field ('expiresAt') Document field to store expiration time
28
+ # @option options [String] :value_field ('value') Document field to store value
29
+ # @option options [String] :type_field ('type') Document field to store value type
30
+ # @option options [::Moped::Session] :backend Use existing backend instance
31
+ # @option options Other options passed to `Moped::Session#new`
32
+ def initialize(options = {})
33
+ super(options)
34
+ collection = options.delete(:collection) || 'moneta'
35
+ db = options.delete(:db) || 'moneta'
36
+ user = options.delete(:user)
37
+ password = options.delete(:password)
38
+ @backend = options[:backend] ||
39
+ begin
40
+ host = options.delete(:host) || '127.0.0.1'
41
+ port = options.delete(:port) || 27017
42
+ ::Moped::Session.new(["#{host}:#{port}"])
43
+ end
44
+ @backend.use(db)
45
+ @backend.login(user, password) if user && password
46
+ @collection = @backend[collection]
47
+ if @backend.command(buildinfo: 1)['version'] >= '2.2'
48
+ @collection.indexes.create({ @expires_field => 1 }, expireAfterSeconds: 0)
49
+ else
50
+ warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
51
+ end
52
+ end
53
+
54
+ # (see Proxy#load)
55
+ def load(key, options = {})
56
+ key = to_binary(key)
57
+ doc = @collection.find(_id: key).one
58
+ if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
59
+ # @expires_field must be a Time object (BSON date datatype)
60
+ expires = expires_at(options, nil)
61
+ @collection.find(_id: key).update(:$set => { @expires_field => expires || nil }) if expires != nil
62
+ doc_to_value(doc)
63
+ end
64
+ end
65
+
66
+ # (see Proxy#store)
67
+ def store(key, value, options = {})
68
+ key = to_binary(key)
69
+ @collection.find(_id: key).upsert(value_to_doc(key, value, options))
70
+ value
71
+ end
72
+
73
+ # (see Proxy#delete)
74
+ def delete(key, options = {})
75
+ value = load(key, options)
76
+ @collection.find(_id: to_binary(key)).remove if value
77
+ value
78
+ end
79
+
80
+ # (see Proxy#increment)
81
+ def increment(key, amount = 1, options = {})
82
+ @backend.with(safe: true, consistency: :strong) do |safe|
83
+ safe[@collection.name].find(_id: to_binary(key)).modify({:$inc => { @value_field => amount }},
84
+ new: true, upsert: true)[@value_field]
85
+ end
86
+ end
87
+
88
+ # (see Proxy#create)
89
+ def create(key, value, options = {})
90
+ key = to_binary(key)
91
+ @backend.with(safe: true, consistency: :strong) do |safe|
92
+ safe[@collection.name].insert(value_to_doc(key, value, options))
93
+ end
94
+ true
95
+ rescue ::Moped::Errors::MongoError => ex
96
+ raise if ex.details['code'] != 11000 # duplicate key error
97
+ false
98
+ end
99
+
100
+ # (see Proxy#clear)
101
+ def clear(options = {})
102
+ @collection.drop
103
+ self
104
+ end
105
+
106
+ protected
107
+
108
+ def to_binary(s)
109
+ ::Moped::BSON::Binary.new(:generic, s)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,121 @@
1
+ require 'moneta/adapters/mongo/base'
2
+ require 'mongo'
3
+
4
+ module Moneta
5
+ module Adapters
6
+ # MongoDB backend
7
+ #
8
+ # Supports expiration, documents will be automatically removed starting
9
+ # with mongodb >= 2.2 (see {http://docs.mongodb.org/manual/tutorial/expire-data/}).
10
+ #
11
+ # You can store hashes directly using this adapter.
12
+ #
13
+ # @example Store hashes
14
+ # db = Moneta::Adapters::MongoOfficial.new
15
+ # db['key'] = {a: 1, b: 2}
16
+ #
17
+ # @api public
18
+ class MongoOfficial < MongoBase
19
+ # @param [Hash] options
20
+ # @option options [String] :collection ('moneta') MongoDB collection name
21
+ # @option options [String] :host ('127.0.0.1') MongoDB server host
22
+ # @option options [String] :user Username used to authenticate
23
+ # @option options [String] :password Password used to authenticate
24
+ # @option options [Integer] :port (MongoDB default port) MongoDB server port
25
+ # @option options [String] :db ('moneta') MongoDB database
26
+ # @option options [Integer] :expires Default expiration time
27
+ # @option options [String] :expires_field ('expiresAt') Document field to store expiration time
28
+ # @option options [String] :value_field ('value') Document field to store value
29
+ # @option options [String] :type_field ('type') Document field to store value type
30
+ # @option options [::Mongo::MongoClient] :backend Use existing backend instance
31
+ # @option options Other options passed to `Mongo::MongoClient#new`
32
+ def initialize(options = {})
33
+ super(options)
34
+ collection = options.delete(:collection) || 'moneta'
35
+ db = options.delete(:db) || 'moneta'
36
+ user = options.delete(:user)
37
+ password = options.delete(:password)
38
+ @backend = options[:backend] ||
39
+ begin
40
+ host = options.delete(:host) || '127.0.0.1'
41
+ port = options.delete(:port) || ::Mongo::MongoClient::DEFAULT_PORT
42
+ ::Mongo::MongoClient.new(host, port, options)
43
+ end
44
+ db = @backend.db(db)
45
+ db.authenticate(user, password, true) if user && password
46
+ @collection = db.collection(collection)
47
+ if @backend.server_version >= '2.2'
48
+ @collection.ensure_index([[@expires_field, ::Mongo::ASCENDING]], expireAfterSeconds: 0)
49
+ else
50
+ warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
51
+ end
52
+ end
53
+
54
+ # (see Proxy#load)
55
+ def load(key, options = {})
56
+ key = to_binary(key)
57
+ doc = @collection.find_one('_id' => key)
58
+ if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
59
+ expires = expires_at(options, nil)
60
+ @collection.update({ '_id' => key },
61
+ # @expires_field must be a Time object (BSON date datatype)
62
+ { '$set' => { @expires_field => expires || nil } }) if expires != nil
63
+ doc_to_value(doc)
64
+ end
65
+ end
66
+
67
+ # (see Proxy#store)
68
+ def store(key, value, options = {})
69
+ key = to_binary(key)
70
+ @collection.update({ '_id' => key },
71
+ value_to_doc(key, value, options),
72
+ { upsert: true })
73
+ value
74
+ end
75
+
76
+ # (see Proxy#delete)
77
+ def delete(key, options = {})
78
+ value = load(key, options)
79
+ @collection.remove('_id' => to_binary(key)) if value
80
+ value
81
+ end
82
+
83
+ # (see Proxy#increment)
84
+ def increment(key, amount = 1, options = {})
85
+ @collection.find_and_modify(query: { '_id' => to_binary(key) },
86
+ update: { '$inc' => { @value_field => amount } },
87
+ new: true,
88
+ upsert: true)[@value_field]
89
+ end
90
+
91
+ # (see Proxy#create)
92
+ def create(key, value, options = {})
93
+ key = to_binary(key)
94
+ @collection.insert(value_to_doc(key, value, options))
95
+ true
96
+ rescue ::Mongo::OperationFailure => ex
97
+ raise if ex.error_code != 11000 # duplicate key error
98
+ false
99
+ end
100
+
101
+ # (see Proxy#clear)
102
+ def clear(options = {})
103
+ @collection.remove
104
+ self
105
+ end
106
+
107
+ # (see Proxy#close)
108
+ def close
109
+ @backend.close
110
+ nil
111
+ end
112
+
113
+ protected
114
+
115
+ def to_binary(s)
116
+ s = s.dup if s.frozen? # HACK: BSON::Binary needs unfrozen string
117
+ ::BSON::Binary.new(s)
118
+ end
119
+ end
120
+ end
121
+ end
@@ -77,11 +77,7 @@ module Moneta
77
77
  protected
78
78
 
79
79
  def new_store(options)
80
- if RUBY_VERSION > '1.9'
81
- ::PStore.new(options[:file], options[:threadsafe])
82
- else
83
- ::PStore.new(options[:file])
84
- end
80
+ ::PStore.new(options[:file], options[:threadsafe])
85
81
  end
86
82
  end
87
83
  end
@@ -14,7 +14,7 @@ module Moneta
14
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
- @backend = options[:backend] || ::Faraday.new(:url => url)
17
+ @backend = options[:backend] || ::Faraday.new(url: url)
18
18
  end
19
19
 
20
20
  # (see Proxy#key?)
@@ -27,7 +27,7 @@ module Moneta
27
27
  ::Sequel.connect(db, options)
28
28
  end
29
29
  @backend.create_table?(table) do
30
- String :k, :null => false, :primary_key => true
30
+ String :k, null: false, primary_key: true
31
31
  Blob :v
32
32
  end
33
33
  @table = @backend[table]
@@ -35,21 +35,21 @@ module Moneta
35
35
 
36
36
  # (see Proxy#key?)
37
37
  def key?(key, options = {})
38
- @table[:k => key] != nil
38
+ @table[k: key] != nil
39
39
  end
40
40
 
41
41
  # (see Proxy#load)
42
42
  def load(key, options = {})
43
- record = @table[:k => key]
43
+ record = @table[k: key]
44
44
  record && record[:v]
45
45
  end
46
46
 
47
47
  # (see Proxy#store)
48
48
  def store(key, value, options = {})
49
49
  begin
50
- @table.insert(:k => key, :v => blob(value))
50
+ @table.insert(k: key, v: blob(value))
51
51
  rescue UniqueConstraintViolation
52
- @table.where(:k => key).update(:v => blob(value))
52
+ @table.where(k: key).update(v: blob(value))
53
53
  end
54
54
  value
55
55
  rescue ::Sequel::DatabaseError
@@ -59,7 +59,7 @@ module Moneta
59
59
 
60
60
  # (see Proxy#store)
61
61
  def create(key, value, options = {})
62
- @table.insert(:k => key, :v => blob(value))
62
+ @table.insert(k: key, v: blob(value))
63
63
  true
64
64
  rescue UniqueConstraintViolation
65
65
  false
@@ -69,12 +69,12 @@ module Moneta
69
69
  def increment(key, amount = 1, options = {})
70
70
  @backend.transaction do
71
71
  locked_table = @table.for_update
72
- if record = locked_table[:k => key]
72
+ if record = locked_table[k: key]
73
73
  value = Utils.to_int(record[:v]) + amount
74
- locked_table.where(:k => key).update(:v => blob(value.to_s))
74
+ locked_table.where(k: key).update(v: blob(value.to_s))
75
75
  value
76
76
  else
77
- locked_table.insert(:k => key, :v => blob(amount.to_s))
77
+ locked_table.insert(k: key, v: blob(amount.to_s))
78
78
  amount
79
79
  end
80
80
  end
@@ -87,7 +87,7 @@ module Moneta
87
87
  # (see Proxy#delete)
88
88
  def delete(key, options = {})
89
89
  if value = load(key, options)
90
- @table.filter(:k => key).delete
90
+ @table.filter(k: key).delete
91
91
  value
92
92
  end
93
93
  end
@@ -4,7 +4,7 @@ module Moneta
4
4
  # @example Add `Moneta::Cache` to proxy stack
5
5
  # Moneta.build do
6
6
  # use(:Cache) do
7
- # adapter { adapter :File, :dir => 'data' }
7
+ # adapter { adapter :File, dir: 'data' }
8
8
  # cache { adapter :Memory }
9
9
  # end
10
10
  # end
@@ -64,10 +64,10 @@ module Moneta
64
64
 
65
65
  def wrap(method, *args)
66
66
  ret = yield
67
- @logger.log(:method => method, :args => args, :return => (method == :clear ? 'self' : ret))
67
+ @logger.log(method: method, args: args, return: (method == :clear ? 'self' : ret))
68
68
  ret
69
69
  rescue Exception => error
70
- @logger.log(:method => method, :args => args, :error => error)
70
+ @logger.log(method: method, args: args, error: error)
71
71
  raise
72
72
  end
73
73
  end
@@ -17,14 +17,14 @@ module Moneta
17
17
  options ? OptionMerger.new(adapter, options) : adapter
18
18
  end
19
19
 
20
- # Return Moneta store with default option :raw => true
20
+ # Return Moneta store with default option raw: true
21
21
  #
22
22
  # @return [OptionMerger]
23
23
  # @api public
24
24
  def raw
25
25
  @raw_store ||=
26
26
  begin
27
- store = with(:raw => true, :only => [:load, :store, :create, :delete])
27
+ store = with(raw: true, only: [:load, :store, :create, :delete])
28
28
  store.instance_variable_set(:@raw_store, store)
29
29
  store
30
30
  end
@@ -36,7 +36,7 @@ module Moneta
36
36
  # @return [OptionMerger]
37
37
  # @api public
38
38
  def prefix(prefix)
39
- with(:prefix => prefix, :except => :clear)
39
+ with(prefix: prefix, except: :clear)
40
40
  end
41
41
 
42
42
  # Return Moneta store with default expiration time
@@ -45,7 +45,7 @@ module Moneta
45
45
  # @return [OptionMerger]
46
46
  # @api public
47
47
  def expires(expires)
48
- with(:expires => expires, :only => [:store, :create, :increment])
48
+ with(expires: expires, only: [:store, :create, :increment])
49
49
  end
50
50
  end
51
51
 
@@ -3,9 +3,9 @@ module Moneta
3
3
  #
4
4
  # @example Share a store
5
5
  # Moneta.build do
6
- # use :Transformer, :key => :marshal, :value => :marshal
6
+ # use :Transformer, key: :marshal, value: :marshal
7
7
  # use :Shared do
8
- # adapter :GDBM, :file => 'shared.db'
8
+ # adapter :GDBM, file: 'shared.db'
9
9
  # end
10
10
  # end
11
11
  #
@@ -6,8 +6,8 @@ module Moneta
6
6
  # Moneta.build do
7
7
  # use(:Stack) do
8
8
  # add { adapter :Redis }
9
- # add { adapter :File, :dir => 'data' }
10
- # add { adapter :File, :dir => 'replicate' }
9
+ # add { adapter :File, dir: 'data' }
10
+ # add { adapter :File, dir: 'replicate' }
11
11
  # end
12
12
  # end
13
13
  #
@@ -80,7 +80,7 @@ module Moneta
80
80
  protected
81
81
 
82
82
  def enter_primitive
83
- @store.create(@lock, '', :expires => false)
83
+ @store.create(@lock, '', expires: false)
84
84
  end
85
85
 
86
86
  def leave_primitive
@@ -105,7 +105,7 @@ module Moneta
105
105
  def initialize(store, counter, max = 1)
106
106
  raise 'Store must support feature :increment' unless store.supports?(:increment)
107
107
  @store, @counter, @max = store, counter, max
108
- @store.increment(@counter, 0, :expires => false) # Ensure that counter exists
108
+ @store.increment(@counter, 0, expires: false) # Ensure that counter exists
109
109
  end
110
110
 
111
111
  protected
@@ -4,17 +4,17 @@ module Moneta
4
4
  #
5
5
  # @example Add `Moneta::Transformer` to proxy stack
6
6
  # Moneta.build do
7
- # transformer :key => [:marshal, :escape], :value => [:marshal]
8
- # adapter :File, :dir => 'data'
7
+ # transformer key: [:marshal, :escape], value: [:marshal]
8
+ # adapter :File, dir: 'data'
9
9
  # end
10
10
  #
11
11
  # @example Bypass serialization
12
- # store.store('key', 'value', :raw => true)
12
+ # store.store('key', 'value', raw: true)
13
13
  # store['key'] # raises an Exception
14
- # store.load('key', :raw => true) # returns 'value'
14
+ # store.load('key', raw: true) # returns 'value'
15
15
  #
16
16
  # store['key'] = 'value'
17
- # store.load('key', :raw => true) # returns "\x04\bI\"\nvalue\x06:\x06ET"
17
+ # store.load('key', raw: true) # returns "\x04\bI\"\nvalue\x06:\x06ET"
18
18
  #
19
19
  # @api public
20
20
  class Transformer < Proxy