moneta 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +26 -8
- data/CHANGES +6 -0
- data/CONTRIBUTORS +2 -1
- data/Gemfile +7 -5
- data/README.md +2 -6
- data/feature_matrix.yaml +0 -10
- data/lib/moneta.rb +9 -9
- data/lib/moneta/adapters/mongo.rb +256 -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/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/nil_values.rb +35 -0
- data/lib/moneta/option_support.rb +51 -0
- 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 +7 -9
- data/script/benchmarks +1 -2
- data/script/contributors +11 -6
- data/spec/active_support/cache_moneta_store_spec.rb +27 -29
- 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/helper.rb +16 -33
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +16 -1
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +1 -1
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +7 -34
- data/spec/moneta/adapters/sequel/helper.rb +37 -0
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +4 -10
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +7 -8
- data/spec/moneta/proxies/shared/shared_unix_spec.rb +10 -0
- data/spec/restserver.rb +15 -0
- metadata +39 -58
- data/lib/moneta/adapters/mongo/base.rb +0 -103
- data/lib/moneta/adapters/mongo/moped.rb +0 -166
- data/lib/moneta/adapters/mongo/official.rb +0 -156
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -26
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -14
- data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -27
- data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -14
- 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/quality_spec.rb +0 -51
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'bson'
|
2
|
-
|
3
|
-
module Moneta
|
4
|
-
module Adapters
|
5
|
-
# @api private
|
6
|
-
class MongoBase
|
7
|
-
include Defaults
|
8
|
-
include ExpiresSupport
|
9
|
-
|
10
|
-
supports :each_key, :create, :increment
|
11
|
-
attr_reader :backend
|
12
|
-
|
13
|
-
DEFAULT_PORT = 27017
|
14
|
-
|
15
|
-
def initialize(options = {})
|
16
|
-
self.default_expires = options.delete(:expires)
|
17
|
-
@expires_field = options.delete(:expires_field) || 'expiresAt'
|
18
|
-
@value_field = options.delete(:value_field) || 'value'
|
19
|
-
@type_field = options.delete(:type_field) || 'type'
|
20
|
-
end
|
21
|
-
|
22
|
-
# (see Proxy#fetch_values)
|
23
|
-
def fetch_values(*keys, **options)
|
24
|
-
return values_at(*keys, **options) unless block_given?
|
25
|
-
hash = Hash[slice(*keys, **options)]
|
26
|
-
keys.map do |key|
|
27
|
-
if hash.key?(key)
|
28
|
-
hash[key]
|
29
|
-
else
|
30
|
-
yield key
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# (see Proxy#values_at)
|
36
|
-
def values_at(*keys, **options)
|
37
|
-
hash = Hash[slice(*keys, **options)]
|
38
|
-
keys.map { |key| hash[key] }
|
39
|
-
end
|
40
|
-
|
41
|
-
protected
|
42
|
-
|
43
|
-
def doc_to_value(doc)
|
44
|
-
case doc[@type_field]
|
45
|
-
when 'Hash'
|
46
|
-
doc = doc.dup
|
47
|
-
doc.delete('_id')
|
48
|
-
doc.delete(@type_field)
|
49
|
-
doc.delete(@expires_field)
|
50
|
-
doc
|
51
|
-
when 'Number'
|
52
|
-
doc[@value_field]
|
53
|
-
else
|
54
|
-
# In ruby_bson version 2 (and probably up), #to_s no longer returns the binary data
|
55
|
-
from_binary(doc[@value_field])
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def value_to_doc(key, value, options)
|
60
|
-
case value
|
61
|
-
when Hash
|
62
|
-
value.merge('_id' => key,
|
63
|
-
@type_field => 'Hash',
|
64
|
-
# @expires_field must be a Time object (BSON date datatype)
|
65
|
-
@expires_field => expires_at(options) || nil)
|
66
|
-
when Float, Integer
|
67
|
-
{ '_id' => key,
|
68
|
-
@type_field => 'Number',
|
69
|
-
@value_field => value,
|
70
|
-
# @expires_field must be a Time object (BSON date datatype)
|
71
|
-
@expires_field => expires_at(options) || nil }
|
72
|
-
when String
|
73
|
-
intvalue = value.to_i
|
74
|
-
{ '_id' => key,
|
75
|
-
@type_field => 'String',
|
76
|
-
@value_field => intvalue.to_s == value ? intvalue : to_binary(value),
|
77
|
-
# @expires_field must be a Time object (BSON date datatype)
|
78
|
-
@expires_field => expires_at(options) || nil }
|
79
|
-
else
|
80
|
-
raise ArgumentError, "Invalid value type: #{value.class}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# BSON will use String#force_encoding to make the string 8-bit
|
85
|
-
# ASCII. This could break unicode text so we should dup in this
|
86
|
-
# case, and it also fails with frozen strings.
|
87
|
-
def to_binary(str)
|
88
|
-
str = str.dup if str.frozen? || str.encoding != Encoding::ASCII_8BIT
|
89
|
-
::BSON::Binary.new(str)
|
90
|
-
end
|
91
|
-
|
92
|
-
if defined?(::BSON::VERSION) and ::BSON::VERSION[0].to_i >= 2
|
93
|
-
def from_binary(binary)
|
94
|
-
binary.is_a?(::BSON::Binary) ? binary.data : binary.to_s
|
95
|
-
end
|
96
|
-
else
|
97
|
-
def from_binary(binary)
|
98
|
-
binary.to_s
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,166 +0,0 @@
|
|
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) || DEFAULT_PORT
|
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'] >= '3.0'
|
48
|
-
# Moped creates indexes in the system.indexes collection which is not writable anymore since Mongo v3
|
49
|
-
warn 'Moneta::Adapters::MongoMoped - You are using the unmaintained Moped gem, expired documents will not be deleted'
|
50
|
-
elsif @backend.command(buildinfo: 1)['version'] >= '2.2'
|
51
|
-
@collection.indexes.create({ @expires_field => 1 }, expireAfterSeconds: 0)
|
52
|
-
else
|
53
|
-
warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# (see Proxy#load)
|
58
|
-
def load(key, options = {})
|
59
|
-
key = to_binary(key)
|
60
|
-
doc = @collection.find(_id: key).one
|
61
|
-
if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
|
62
|
-
# @expires_field must be a Time object (BSON date datatype)
|
63
|
-
expires = expires_at(options, nil)
|
64
|
-
@collection.find(_id: key).update(:$set => { @expires_field => expires || nil }) if expires != nil
|
65
|
-
doc_to_value(doc)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# (see Proxy#store)
|
70
|
-
def store(key, value, options = {})
|
71
|
-
key = to_binary(key)
|
72
|
-
@collection.find(_id: key).upsert(value_to_doc(key, value, options))
|
73
|
-
value
|
74
|
-
end
|
75
|
-
|
76
|
-
# (see Proxy#each_key)
|
77
|
-
def each_key
|
78
|
-
return enum_for(:each_key) unless block_given?
|
79
|
-
@collection.find.each { |doc| yield from_binary(doc[:_id]) }
|
80
|
-
self
|
81
|
-
end
|
82
|
-
|
83
|
-
# (see Proxy#delete)
|
84
|
-
def delete(key, options = {})
|
85
|
-
value = load(key, options)
|
86
|
-
@collection.find(_id: to_binary(key)).remove if value
|
87
|
-
value
|
88
|
-
end
|
89
|
-
|
90
|
-
# (see Proxy#increment)
|
91
|
-
def increment(key, amount = 1, options = {})
|
92
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
93
|
-
safe[@collection.name]
|
94
|
-
.find(_id: to_binary(key))
|
95
|
-
.modify({ :$inc => { @value_field => amount } },
|
96
|
-
new: true, upsert: true)[@value_field]
|
97
|
-
end
|
98
|
-
rescue ::Moped::Errors::OperationFailure
|
99
|
-
tries ||= 0
|
100
|
-
tries += 1
|
101
|
-
retry if tries < 3
|
102
|
-
raise # otherwise
|
103
|
-
end
|
104
|
-
|
105
|
-
# (see Proxy#create)
|
106
|
-
def create(key, value, options = {})
|
107
|
-
key = to_binary(key)
|
108
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
109
|
-
safe[@collection.name].insert(value_to_doc(key, value, options))
|
110
|
-
end
|
111
|
-
true
|
112
|
-
rescue ::Moped::Errors::MongoError => ex
|
113
|
-
raise if ex.details['code'] != 11000 # duplicate key error
|
114
|
-
false
|
115
|
-
end
|
116
|
-
|
117
|
-
# (see Proxy#clear)
|
118
|
-
def clear(options = {})
|
119
|
-
@collection.find.remove_all
|
120
|
-
self
|
121
|
-
end
|
122
|
-
|
123
|
-
# (see Proxy#slice)
|
124
|
-
def slice(*keys, **options)
|
125
|
-
query = @collection.find(_id: { :$in => keys.map(&method(:to_binary)) })
|
126
|
-
pairs = query.map do |doc|
|
127
|
-
next if doc[@expires_field] && doc[@expires_field] < Time.now
|
128
|
-
[from_binary(doc[:_id]), doc_to_value(doc)]
|
129
|
-
end.compact
|
130
|
-
|
131
|
-
if (expires = expires_at(options, nil)) != nil
|
132
|
-
query.update_all(:$set => { @expires_field => expires || nil })
|
133
|
-
end
|
134
|
-
|
135
|
-
pairs
|
136
|
-
end
|
137
|
-
|
138
|
-
# (see Proxy#merge!)
|
139
|
-
def merge!(pairs, options = {})
|
140
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
141
|
-
collection = safe[@collection.name]
|
142
|
-
existing = collection
|
143
|
-
.find(_id: { :$in => pairs.map { |key, _| to_binary(key) }.to_a })
|
144
|
-
.map { |doc| [from_binary(doc[:_id]), doc_to_value(doc)] }
|
145
|
-
.to_h
|
146
|
-
|
147
|
-
update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
|
148
|
-
unless insert_pairs.empty?
|
149
|
-
collection.insert(insert_pairs.map do |key, value|
|
150
|
-
value_to_doc(to_binary(key), value, options)
|
151
|
-
end)
|
152
|
-
end
|
153
|
-
|
154
|
-
update_pairs.each do |key, value|
|
155
|
-
value = yield(key, existing[key], value) if block_given?
|
156
|
-
binary = to_binary(key)
|
157
|
-
collection
|
158
|
-
.find(_id: binary)
|
159
|
-
.update(value_to_doc(binary, value, options))
|
160
|
-
end
|
161
|
-
end
|
162
|
-
self
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
@@ -1,156 +0,0 @@
|
|
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::Client] :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
|
-
@backend = options[:backend] ||
|
37
|
-
begin
|
38
|
-
host = options.delete(:host) || '127.0.0.1'
|
39
|
-
port = options.delete(:port) || DEFAULT_PORT
|
40
|
-
options[:logger] ||= ::Logger.new(STDERR).tap do |logger|
|
41
|
-
logger.level = ::Logger::ERROR
|
42
|
-
end
|
43
|
-
::Mongo::Client.new(["#{host}:#{port}"], options)
|
44
|
-
end
|
45
|
-
@backend.use(db)
|
46
|
-
@collection = @backend[collection]
|
47
|
-
if @backend.command(buildinfo: 1).documents.first['version'] >= '2.2'
|
48
|
-
@collection.indexes.create_one({ @expires_field => 1 }, expire_after: 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).limit(1).first
|
58
|
-
if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
|
59
|
-
expires = expires_at(options, nil)
|
60
|
-
# @expires_field must be a Time object (BSON date datatype)
|
61
|
-
@collection.update_one({ _id: key },
|
62
|
-
'$set' => { @expires_field => expires }) unless 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.replace_one({ _id: key },
|
71
|
-
value_to_doc(key, value, options),
|
72
|
-
upsert: true)
|
73
|
-
value
|
74
|
-
end
|
75
|
-
|
76
|
-
# (see Proxy#each_key)
|
77
|
-
def each_key
|
78
|
-
return enum_for(:each_key) unless block_given?
|
79
|
-
@collection.find.each { |doc| yield from_binary(doc[:_id]) }
|
80
|
-
self
|
81
|
-
end
|
82
|
-
|
83
|
-
# (see Proxy#delete)
|
84
|
-
def delete(key, options = {})
|
85
|
-
key = to_binary(key)
|
86
|
-
if doc = @collection.find(_id: key).find_one_and_delete and
|
87
|
-
!doc[@expires_field] || doc[@expires_field] >= Time.now
|
88
|
-
doc_to_value(doc)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# (see Proxy#increment)
|
93
|
-
def increment(key, amount = 1, options = {})
|
94
|
-
@collection.find_one_and_update({ _id: to_binary(key) },
|
95
|
-
{ '$inc' => { @value_field => amount } },
|
96
|
-
return_document: :after,
|
97
|
-
upsert: true)[@value_field]
|
98
|
-
end
|
99
|
-
|
100
|
-
# (see Proxy#create)
|
101
|
-
def create(key, value, options = {})
|
102
|
-
key = to_binary(key)
|
103
|
-
@collection.insert_one(value_to_doc(key, value, options))
|
104
|
-
true
|
105
|
-
rescue ::Mongo::Error::OperationFailure => ex
|
106
|
-
raise unless ex.message =~ /^E11000 / # duplicate key error
|
107
|
-
false
|
108
|
-
end
|
109
|
-
|
110
|
-
# (see Proxy#clear)
|
111
|
-
def clear(options = {})
|
112
|
-
@collection.delete_many
|
113
|
-
self
|
114
|
-
end
|
115
|
-
|
116
|
-
# (see Proxy#close)
|
117
|
-
def close
|
118
|
-
@backend.close
|
119
|
-
nil
|
120
|
-
end
|
121
|
-
|
122
|
-
# (see Proxy#slice)
|
123
|
-
def slice(*keys, **options)
|
124
|
-
query = @collection.find(_id: { :$in => keys.map(&method(:to_binary)) })
|
125
|
-
pairs = query.map do |doc|
|
126
|
-
next if doc[@expires_field] && doc[@expires_field] < Time.now
|
127
|
-
[from_binary(doc[:_id]), doc_to_value(doc)]
|
128
|
-
end.compact
|
129
|
-
|
130
|
-
if (expires = expires_at(options, nil)) != nil
|
131
|
-
query.update_many(:$set => { @expires_field => expires || nil })
|
132
|
-
end
|
133
|
-
|
134
|
-
pairs
|
135
|
-
end
|
136
|
-
|
137
|
-
# (see Proxy#merge!)
|
138
|
-
def merge!(pairs, options = {})
|
139
|
-
existing = Hash[slice(*pairs.map { |key, _| key })]
|
140
|
-
update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
|
141
|
-
|
142
|
-
@collection.insert_many(insert_pairs.map do |key, value|
|
143
|
-
value_to_doc(to_binary(key), value, options)
|
144
|
-
end)
|
145
|
-
|
146
|
-
update_pairs.each do |key, value|
|
147
|
-
value = yield(key, existing[key], value) if block_given?
|
148
|
-
binary = to_binary(key)
|
149
|
-
@collection.replace_one({ _id: binary }, value_to_doc(binary, value, options))
|
150
|
-
end
|
151
|
-
|
152
|
-
self
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
describe 'adapter_mongo_moped', adapter: :Mongo do
|
2
|
-
let(:t_res) { 0.125 }
|
3
|
-
let(:min_ttl) { t_res }
|
4
|
-
|
5
|
-
moneta_build do
|
6
|
-
Moneta::Adapters::MongoMoped.new(mongo_config(
|
7
|
-
db: File.basename(__FILE__, '.rb'), collection: 'moped'
|
8
|
-
))
|
9
|
-
end
|
10
|
-
|
11
|
-
moneta_specs ADAPTER_SPECS.with_each_key.with_native_expires.simplevalues_only
|
12
|
-
|
13
|
-
it 'automatically deletes expired document', unsupported: true do
|
14
|
-
store.store('key', 'val', expires: 5)
|
15
|
-
|
16
|
-
i = 0
|
17
|
-
query = store.instance_variable_get(:@collection).find(_id: ::BSON::Binary.new('key'))
|
18
|
-
while i < 70 && query.first
|
19
|
-
i += 1
|
20
|
-
sleep 1 # Mongo needs up to 60 seconds
|
21
|
-
end
|
22
|
-
|
23
|
-
i.should be > 0 # Indicates that it took at least one sleep to expire
|
24
|
-
query.count.should == 0
|
25
|
-
end
|
26
|
-
end
|