moneta 0.7.17 → 0.7.18
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +15 -9
- data/CHANGES +12 -1
- data/CONTRIBUTORS +2 -2
- data/Gemfile +3 -0
- data/README.md +30 -5
- data/Rakefile +1 -1
- data/lib/active_support/cache/moneta_store.rb +5 -2
- data/lib/moneta/adapters/couch.rb +63 -5
- data/lib/moneta/adapters/file.rb +29 -12
- data/lib/moneta/adapters/fog.rb +1 -0
- data/lib/moneta/adapters/mongo.rb +74 -22
- data/lib/moneta/adapters/sqlite.rb +6 -5
- data/lib/moneta/pool.rb +28 -5
- data/lib/moneta/transformer/config.rb +37 -34
- data/lib/moneta/version.rb +1 -1
- data/script/contributors +7 -0
- data/script/generate-specs +89 -30
- data/script/install-bundle +1 -1
- data/script/start-services +6 -12
- data/script/wait-services +15 -0
- data/spec/active_support/cache_moneta_store_spec.rb +3 -3
- data/spec/moneta/adapter_couch_spec.rb +14 -6
- data/spec/moneta/adapter_memory_spec.rb +29 -0
- data/spec/moneta/adapter_mongo_spec.rb +7 -0
- data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +7 -0
- data/spec/moneta/adapter_pstore_spec.rb +42 -0
- data/spec/moneta/expires_file_spec.rb +4 -0
- data/spec/moneta/expires_memory_spec.rb +29 -0
- data/spec/moneta/expires_memory_with_default_expires_spec.rb +29 -0
- data/spec/moneta/lock_spec.rb +29 -0
- data/spec/moneta/null_adapter_spec.rb +13 -0
- data/spec/moneta/proxy_expires_memory_spec.rb +29 -0
- data/spec/moneta/simple_activerecord_spec.rb +42 -0
- data/spec/moneta/simple_activerecord_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_cassandra_spec.rb +42 -0
- data/spec/moneta/simple_client_tcp_spec.rb +42 -0
- data/spec/moneta/simple_client_unix_spec.rb +42 -0
- data/spec/moneta/simple_couch_spec.rb +45 -2
- data/spec/moneta/simple_couch_with_expires_spec.rb +46 -2
- data/spec/moneta/simple_datamapper_spec.rb +42 -0
- data/spec/moneta/simple_datamapper_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_datamapper_with_repository_spec.rb +42 -0
- data/spec/moneta/simple_daybreak_spec.rb +42 -0
- data/spec/moneta/simple_daybreak_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_dbm_spec.rb +42 -0
- data/spec/moneta/simple_dbm_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_file_spec.rb +42 -0
- data/spec/moneta/simple_file_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_fog_spec.rb +42 -0
- data/spec/moneta/simple_fog_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_gdbm_spec.rb +42 -0
- data/spec/moneta/simple_gdbm_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_hashfile_spec.rb +42 -0
- data/spec/moneta/simple_hashfile_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_hbase_spec.rb +42 -0
- data/spec/moneta/simple_hbase_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_kyotocabinet_spec.rb +42 -0
- data/spec/moneta/simple_kyotocabinet_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_leveldb_spec.rb +42 -0
- data/spec/moneta/simple_leveldb_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_localmemcache_spec.rb +42 -0
- data/spec/moneta/simple_localmemcache_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_lruhash_spec.rb +29 -0
- data/spec/moneta/simple_lruhash_with_expires_spec.rb +29 -0
- data/spec/moneta/simple_memcached_dalli_spec.rb +42 -0
- data/spec/moneta/simple_memcached_native_spec.rb +42 -0
- data/spec/moneta/simple_memcached_spec.rb +42 -0
- data/spec/moneta/simple_memory_spec.rb +29 -0
- data/spec/moneta/simple_memory_with_compress_spec.rb +29 -0
- data/spec/moneta/simple_memory_with_expires_spec.rb +29 -0
- data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +6 -0
- data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +8 -0
- data/spec/moneta/simple_memory_with_prefix_spec.rb +29 -0
- data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +29 -0
- data/spec/moneta/simple_mongo_spec.rb +42 -0
- data/spec/moneta/simple_null_spec.rb +16 -0
- data/spec/moneta/simple_pstore_spec.rb +42 -0
- data/spec/moneta/simple_pstore_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_redis_spec.rb +42 -0
- data/spec/moneta/simple_restclient_spec.rb +42 -0
- data/spec/moneta/simple_riak_spec.rb +42 -0
- data/spec/moneta/simple_riak_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_sdbm_spec.rb +42 -0
- data/spec/moneta/simple_sdbm_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_sequel_spec.rb +42 -0
- data/spec/moneta/simple_sequel_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_sqlite_spec.rb +42 -0
- data/spec/moneta/simple_sqlite_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_tdb_spec.rb +42 -0
- data/spec/moneta/simple_tdb_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_tokyocabinet_spec.rb +42 -0
- data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_tokyotyrant_spec.rb +42 -0
- data/spec/moneta/simple_tokyotyrant_with_expires_spec.rb +42 -0
- data/spec/moneta/simple_yaml_spec.rb +42 -0
- data/spec/moneta/simple_yaml_with_expires_spec.rb +42 -0
- data/spec/moneta/transformer_bzip2_spec.rb +3 -0
- data/spec/moneta/transformer_key_inspect_spec.rb +6 -0
- data/spec/moneta/transformer_key_marshal_spec.rb +29 -0
- data/spec/moneta/transformer_key_to_s_spec.rb +6 -0
- data/spec/moneta/transformer_key_yaml_spec.rb +29 -0
- data/spec/moneta/transformer_lz4_spec.rb +3 -0
- data/spec/moneta/transformer_lzma_spec.rb +3 -0
- data/spec/moneta/transformer_lzo_spec.rb +3 -0
- data/spec/moneta/transformer_marshal_base64_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_city128_spec.rb +152 -0
- data/spec/moneta/transformer_marshal_city32_spec.rb +152 -0
- data/spec/moneta/transformer_marshal_city64_spec.rb +152 -0
- data/spec/moneta/transformer_marshal_escape_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_hmac_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_md5_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_md5_spread_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_prefix_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_qp_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_rmd160_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_sha1_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_sha256_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_sha384_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_sha512_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_truncate_spec.rb +29 -0
- data/spec/moneta/transformer_marshal_uuencode_spec.rb +29 -0
- data/spec/moneta/transformer_ox_spec.rb +29 -0
- data/spec/moneta/transformer_quicklz_spec.rb +3 -0
- data/spec/moneta/transformer_snappy_spec.rb +3 -0
- data/spec/moneta/transformer_value_marshal_spec.rb +29 -0
- data/spec/moneta/transformer_value_yaml_spec.rb +29 -0
- data/spec/moneta/transformer_yaml_spec.rb +29 -0
- data/spec/moneta/transformer_zlib_spec.rb +3 -0
- data/spec/moneta/weak_create_spec.rb +2 -1
- data/spec/moneta/weak_increment_spec.rb +2 -1
- data/spec/monetaspecs.rb +29879 -6167
- metadata +10 -2
|
@@ -26,16 +26,17 @@ module Moneta
|
|
|
26
26
|
@backend.busy_timeout(options[:busy_timeout] || 1000)
|
|
27
27
|
@backend.execute("create table if not exists #{table} (k blob not null primary key, v blob)")
|
|
28
28
|
@stmts =
|
|
29
|
-
[@
|
|
29
|
+
[@exists = @backend.prepare("select exists(select 1 from #{table} where k = ?)"),
|
|
30
|
+
@select = @backend.prepare("select v from #{table} where k = ?"),
|
|
30
31
|
@replace = @backend.prepare("replace into #{table} values (?, ?)"),
|
|
31
|
-
@delete
|
|
32
|
-
@clear
|
|
33
|
-
@create
|
|
32
|
+
@delete = @backend.prepare("delete from #{table} where k = ?"),
|
|
33
|
+
@clear = @backend.prepare("delete from #{table}"),
|
|
34
|
+
@create = @backend.prepare("insert into #{table} values (?, ?)")]
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
# (see Proxy#key?)
|
|
37
38
|
def key?(key, options = {})
|
|
38
|
-
|
|
39
|
+
@exists.execute!(key).first.first.to_i == 1
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
# (see Proxy#load)
|
data/lib/moneta/pool.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
1
3
|
module Moneta
|
|
2
4
|
# Creates a pool of stores.
|
|
3
5
|
# Each thread gets its own store.
|
|
@@ -14,24 +16,45 @@ module Moneta
|
|
|
14
16
|
class Pool < Wrapper
|
|
15
17
|
# @param [Moneta store] adapter The underlying store
|
|
16
18
|
# @param [Hash] options
|
|
19
|
+
# @option options [String] :mutex (::Mutex.new) Mutex object
|
|
17
20
|
def initialize(options = {}, &block)
|
|
18
21
|
super(nil)
|
|
22
|
+
@mutex = options[:mutex] || ::Mutex.new
|
|
23
|
+
@id = "Moneta::Pool(#{object_id})"
|
|
19
24
|
@builder = Builder.new(&block)
|
|
20
|
-
@pool, @
|
|
25
|
+
@pool, @all = [], []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def close
|
|
29
|
+
@mutex.synchronize do
|
|
30
|
+
raise '#close can only when no thread is using the pool' if @all.size != @pool.size
|
|
31
|
+
@all.each(&:close)
|
|
32
|
+
@all = @pool = nil
|
|
33
|
+
end
|
|
21
34
|
end
|
|
22
35
|
|
|
23
36
|
protected
|
|
24
37
|
|
|
25
38
|
def adapter
|
|
26
|
-
|
|
39
|
+
Thread.current[@id]
|
|
27
40
|
end
|
|
28
41
|
|
|
29
42
|
def wrap(*args)
|
|
30
|
-
|
|
31
|
-
@active[Thread.current] = @pool.pop
|
|
43
|
+
store = Thread.current[@id] = pop
|
|
32
44
|
yield
|
|
33
45
|
ensure
|
|
34
|
-
@
|
|
46
|
+
Thread.current[@id] = nil
|
|
47
|
+
@mutex.synchronize { @pool << store }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def pop
|
|
51
|
+
if @mutex.synchronize { @pool.empty? }
|
|
52
|
+
store = @builder.build.last
|
|
53
|
+
@mutex.synchronize { @all << store }
|
|
54
|
+
store
|
|
55
|
+
else
|
|
56
|
+
@mutex.synchronize { @pool.pop }
|
|
57
|
+
end
|
|
35
58
|
end
|
|
36
59
|
end
|
|
37
60
|
end
|
|
@@ -2,42 +2,45 @@ module Moneta
|
|
|
2
2
|
class Transformer
|
|
3
3
|
# Available key/value transformers
|
|
4
4
|
TRANSFORMER = {
|
|
5
|
-
# Name => [ Type, Load, Dump,
|
|
6
|
-
:bencode => [ :serialize, '::BEncode.load(%s)', '::BEncode.dump(%s)',
|
|
7
|
-
:bert => [ :serialize, '::BERT.decode(%s)', '::BERT.encode(%s)',
|
|
8
|
-
:bson => [ :serialize, "::BSON.deserialize(%s)['v']", "::BSON.serialize('v'=>%s).to_s",
|
|
9
|
-
:json => [ :serialize, '::MultiJson.load(%s).first', '::MultiJson.dump([%s])',
|
|
10
|
-
:marshal => [ :serialize, '::Marshal.load(%s)', '::Marshal.dump(%s)'
|
|
11
|
-
:msgpack => [ :serialize, '::MessagePack.unpack(%s)', '::MessagePack.pack(%s)',
|
|
12
|
-
:ox => [ :serialize, '::Ox.parse_obj(%s)', '::Ox.dump(%s)',
|
|
13
|
-
:tnet => [ :serialize, '::TNetstring.parse(%s).first', '::TNetstring.dump(%s)',
|
|
14
|
-
:yaml => [ :serialize, '::YAML.load(%s)', '::YAML.dump(%s)',
|
|
15
|
-
:bzip2 => [ :compress, '::Bzip2.uncompress(%s)', '::Bzip2.compress(%s)',
|
|
16
|
-
:lz4 => [ :compress, '::LZ4.uncompress(%s)', '::LZ4.compress(%s)',
|
|
17
|
-
:lzma => [ :compress, '::LZMA.decompress(%s)', '::LZMA.compress(%s)',
|
|
18
|
-
:lzo => [ :compress, '::LZO.decompress(%s)', '::LZO.compress(%s)',
|
|
19
|
-
:snappy => [ :compress, '::Snappy.inflate(%s)', '::Snappy.deflate(%s)',
|
|
20
|
-
:quicklz => [ :compress, '::QuickLZ.decompress(%s)', '::QuickLZ.compress(%s)',
|
|
21
|
-
:zlib => [ :compress, '::Zlib::Inflate.inflate(%s)', '::Zlib::Deflate.deflate(%s)',
|
|
22
|
-
:qp => [ :encode, "%s.unpack('M').first", "[%s].pack('M')"
|
|
23
|
-
:uuencode => [ :encode, "%s.unpack('u').first", "[%s].pack('u')"
|
|
5
|
+
# Name => [ Type, Load, Dump, Library ],
|
|
6
|
+
:bencode => [ :serialize, '::BEncode.load(%s)', '::BEncode.dump(%s)', 'bencode' ],
|
|
7
|
+
:bert => [ :serialize, '::BERT.decode(%s)', '::BERT.encode(%s)', 'bert' ],
|
|
8
|
+
:bson => [ :serialize, "::BSON.deserialize(%s)['v']", "::BSON.serialize('v'=>%s).to_s", 'bson' ],
|
|
9
|
+
:json => [ :serialize, '::MultiJson.load(%s).first', '::MultiJson.dump([%s])', 'multi_json' ],
|
|
10
|
+
:marshal => [ :serialize, '::Marshal.load(%s)', '::Marshal.dump(%s)' ],
|
|
11
|
+
:msgpack => [ :serialize, '::MessagePack.unpack(%s)', '::MessagePack.pack(%s)', 'msgpack' ],
|
|
12
|
+
:ox => [ :serialize, '::Ox.parse_obj(%s)', '::Ox.dump(%s)', 'ox' ],
|
|
13
|
+
:tnet => [ :serialize, '::TNetstring.parse(%s).first', '::TNetstring.dump(%s)', 'tnetstring' ],
|
|
14
|
+
:yaml => [ :serialize, '::YAML.load(%s)', '::YAML.dump(%s)', 'yaml' ],
|
|
15
|
+
:bzip2 => [ :compress, '::Bzip2.uncompress(%s)', '::Bzip2.compress(%s)', 'bzip2' ],
|
|
16
|
+
:lz4 => [ :compress, '::LZ4.uncompress(%s)', '::LZ4.compress(%s)', 'lz4-ruby' ],
|
|
17
|
+
:lzma => [ :compress, '::LZMA.decompress(%s)', '::LZMA.compress(%s)', 'lzma' ],
|
|
18
|
+
:lzo => [ :compress, '::LZO.decompress(%s)', '::LZO.compress(%s)', 'lzoruby' ],
|
|
19
|
+
:snappy => [ :compress, '::Snappy.inflate(%s)', '::Snappy.deflate(%s)', 'snappy' ],
|
|
20
|
+
:quicklz => [ :compress, '::QuickLZ.decompress(%s)', '::QuickLZ.compress(%s)', 'qlzruby' ],
|
|
21
|
+
:zlib => [ :compress, '::Zlib::Inflate.inflate(%s)', '::Zlib::Deflate.deflate(%s)', 'zlib' ],
|
|
22
|
+
:qp => [ :encode, "%s.unpack('M').first", "[%s].pack('M')" ],
|
|
23
|
+
:uuencode => [ :encode, "%s.unpack('u').first", "[%s].pack('u')" ],
|
|
24
24
|
:base64 => RUBY_VERSION > '1.9' ?
|
|
25
|
-
[ :encode, "%s.unpack('m0').first", "[%s].pack('m0')"
|
|
26
|
-
[ :encode, "%s.unpack('m').first", "[%s].pack('m').gsub(\"\n\", '')"
|
|
27
|
-
:escape => [ :encode, 'Helper.unescape(%s)', 'Helper.escape(%s)'
|
|
25
|
+
[ :encode, "%s.unpack('m0').first", "[%s].pack('m0')" ] :
|
|
26
|
+
[ :encode, "%s.unpack('m').first", "[%s].pack('m').gsub(\"\n\", '')" ],
|
|
27
|
+
:escape => [ :encode, 'Helper.unescape(%s)', 'Helper.escape(%s)' ],
|
|
28
28
|
:hmac => [ :hmac, 'Helper.hmacverify(%s, options[:secret] || @secret)',
|
|
29
|
-
'Helper.hmacsign(%s, options[:secret] || @secret)',
|
|
30
|
-
:truncate => [ :truncate, nil, 'Helper.truncate(%s, @maxlen)',
|
|
31
|
-
:md5 => [ :digest, nil, '::Digest::MD5.hexdigest(%s)',
|
|
32
|
-
:rmd160 => [ :digest, nil, '::Digest::RMD160.hexdigest(%s)',
|
|
33
|
-
:sha1 => [ :digest, nil, '::Digest::SHA1.hexdigest(%s)',
|
|
34
|
-
:sha256 => [ :digest, nil, '::Digest::SHA256.hexdigest(%s)',
|
|
35
|
-
:sha384 => [ :digest, nil, '::Digest::SHA384.hexdigest(%s)',
|
|
36
|
-
:sha512 => [ :digest, nil, '::Digest::SHA512.hexdigest(%s)',
|
|
37
|
-
:
|
|
38
|
-
:
|
|
39
|
-
:
|
|
40
|
-
:
|
|
29
|
+
'Helper.hmacsign(%s, options[:secret] || @secret)', 'openssl' ],
|
|
30
|
+
:truncate => [ :truncate, nil, 'Helper.truncate(%s, @maxlen)', 'digest/md5' ],
|
|
31
|
+
:md5 => [ :digest, nil, '::Digest::MD5.hexdigest(%s)', 'digest/md5' ],
|
|
32
|
+
:rmd160 => [ :digest, nil, '::Digest::RMD160.hexdigest(%s)', 'digest/rmd160' ],
|
|
33
|
+
:sha1 => [ :digest, nil, '::Digest::SHA1.hexdigest(%s)', 'digest/sha1' ],
|
|
34
|
+
:sha256 => [ :digest, nil, '::Digest::SHA256.hexdigest(%s)', 'digest/sha2' ],
|
|
35
|
+
:sha384 => [ :digest, nil, '::Digest::SHA384.hexdigest(%s)', 'digest/sha2' ],
|
|
36
|
+
:sha512 => [ :digest, nil, '::Digest::SHA512.hexdigest(%s)', 'digest/sha2' ],
|
|
37
|
+
:city32 => [ :digest, nil, '::CityHash.hash32(%s).to_s(16)', 'cityhash' ],
|
|
38
|
+
:city64 => [ :digest, nil, '::CityHash.hash64(%s).to_s(16)', 'cityhash' ],
|
|
39
|
+
:city128 => [ :digest, nil, '::CityHash.hash128(%s).to_s(16)', 'cityhash' ],
|
|
40
|
+
:prefix => [ :prefix, nil, '(options[:prefix] || @prefix)+%s' ],
|
|
41
|
+
:spread => [ :spread, nil, 'Helper.spread(%s)' ],
|
|
42
|
+
:to_s => [ :string, nil, '%s.to_s' ],
|
|
43
|
+
:inspect => [ :string, nil, '%s.inspect' ],
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
# Allowed value transformers (Read it like a regular expression!)
|
data/lib/moneta/version.rb
CHANGED
data/script/contributors
ADDED
data/script/generate-specs
CHANGED
|
@@ -7,8 +7,8 @@ class Specs
|
|
|
7
7
|
|
|
8
8
|
def initialize(options = {})
|
|
9
9
|
@specs = options.delete(:specs).to_a
|
|
10
|
-
@key = options.delete(:key) || %w(object string hash boolean nil integer)
|
|
11
|
-
@value = options.delete(:value) || %w(object string hash boolean nil integer)
|
|
10
|
+
@key = options.delete(:key) || %w(object string hash boolean nil integer number)
|
|
11
|
+
@value = options.delete(:value) || %w(object string hash boolean nil integer number)
|
|
12
12
|
@features = []
|
|
13
13
|
[:expires, :expires_native, :increment, :create].each do |feature|
|
|
14
14
|
@features << feature if @specs.include?(feature)
|
|
@@ -21,8 +21,8 @@ class Specs
|
|
|
21
21
|
Specs.new({:specs => specs, :key => key, :value => value}.merge(options))
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def
|
|
25
|
-
new(:key => %w(
|
|
24
|
+
def simplestringkeys_only
|
|
25
|
+
new(:key => %w(simplestring))
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def stringvalues_only
|
|
@@ -404,12 +404,12 @@ end
|
|
|
404
404
|
:store => :Couch,
|
|
405
405
|
:options => ":db => 'simple_couch'",
|
|
406
406
|
:load_value => '::Marshal.load(value.unpack(\'m\').first)',
|
|
407
|
-
:specs => STANDARD_SPECS.without_increment
|
|
407
|
+
:specs => STANDARD_SPECS.without_increment
|
|
408
408
|
},
|
|
409
409
|
'simple_couch_with_expires' => {
|
|
410
410
|
:store => :Couch,
|
|
411
411
|
:options => ":db => 'simple_couch_with_expires', :expires => true",
|
|
412
|
-
:specs => STANDARD_SPECS.without_increment.
|
|
412
|
+
:specs => STANDARD_SPECS.without_increment.with_expires,
|
|
413
413
|
:load_value => '::Marshal.load(value.unpack(\'m\').first)'
|
|
414
414
|
},
|
|
415
415
|
'simple_mongo' => {
|
|
@@ -495,16 +495,18 @@ end
|
|
|
495
495
|
:specs => STANDARD_SPECS.without_increment.without_create.with_expires
|
|
496
496
|
},
|
|
497
497
|
'weak_create' => {
|
|
498
|
+
:preamble => "start_restserver\n",
|
|
498
499
|
:build => %{Moneta.build do
|
|
499
500
|
use :WeakCreate
|
|
500
|
-
adapter :
|
|
501
|
+
adapter :RestClient, :url => 'http://localhost:8808/moneta/'
|
|
501
502
|
end},
|
|
502
503
|
:specs => ADAPTER_SPECS.without_increment.without_concurrent
|
|
503
504
|
},
|
|
504
505
|
'weak_increment' => {
|
|
506
|
+
:preamble => "start_restserver\n",
|
|
505
507
|
:build => %{Moneta.build do
|
|
506
508
|
use :WeakIncrement
|
|
507
|
-
adapter :
|
|
509
|
+
adapter :RestClient, :url => 'http://localhost:8808/moneta/'
|
|
508
510
|
end},
|
|
509
511
|
:specs => ADAPTER_SPECS.without_create.without_concurrent
|
|
510
512
|
},
|
|
@@ -1103,6 +1105,42 @@ end},
|
|
|
1103
1105
|
it 'compile transformer class' do
|
|
1104
1106
|
store.should_not be_nil
|
|
1105
1107
|
Moneta::Transformer::MarshalMd5SpreadKeyMarshalValue.should_not be_nil
|
|
1108
|
+
end}
|
|
1109
|
+
},
|
|
1110
|
+
'transformer_marshal_city32' => {
|
|
1111
|
+
:build => %{Moneta.build do
|
|
1112
|
+
use :Transformer, :key => [:marshal, :city32], :value => :marshal
|
|
1113
|
+
adapter :Memory
|
|
1114
|
+
end},
|
|
1115
|
+
:specs => STANDARD_SPECS.without_persist,
|
|
1116
|
+
:tests => %{
|
|
1117
|
+
it 'compile transformer class' do
|
|
1118
|
+
store.should_not be_nil
|
|
1119
|
+
Moneta::Transformer::MarshalCity32KeyMarshalValue.should_not be_nil
|
|
1120
|
+
end}
|
|
1121
|
+
},
|
|
1122
|
+
'transformer_marshal_city64' => {
|
|
1123
|
+
:build => %{Moneta.build do
|
|
1124
|
+
use :Transformer, :key => [:marshal, :city64], :value => :marshal
|
|
1125
|
+
adapter :Memory
|
|
1126
|
+
end},
|
|
1127
|
+
:specs => STANDARD_SPECS.without_persist,
|
|
1128
|
+
:tests => %{
|
|
1129
|
+
it 'compile transformer class' do
|
|
1130
|
+
store.should_not be_nil
|
|
1131
|
+
Moneta::Transformer::MarshalCity64KeyMarshalValue.should_not be_nil
|
|
1132
|
+
end}
|
|
1133
|
+
},
|
|
1134
|
+
'transformer_marshal_city128' => {
|
|
1135
|
+
:build => %{Moneta.build do
|
|
1136
|
+
use :Transformer, :key => [:marshal, :city128], :value => :marshal
|
|
1137
|
+
adapter :Memory
|
|
1138
|
+
end},
|
|
1139
|
+
:specs => STANDARD_SPECS.without_persist,
|
|
1140
|
+
:tests => %{
|
|
1141
|
+
it 'compile transformer class' do
|
|
1142
|
+
store.should_not be_nil
|
|
1143
|
+
Moneta::Transformer::MarshalCity128KeyMarshalValue.should_not be_nil
|
|
1106
1144
|
end}
|
|
1107
1145
|
},
|
|
1108
1146
|
'transformer_marshal_truncate' => {
|
|
@@ -1187,7 +1225,7 @@ end}
|
|
|
1187
1225
|
},
|
|
1188
1226
|
'adapter_couch' => {
|
|
1189
1227
|
:build => "Moneta::Adapters::Couch.new(:db => 'adapter_couch')",
|
|
1190
|
-
:specs => ADAPTER_SPECS.without_increment.
|
|
1228
|
+
:specs => ADAPTER_SPECS.without_increment.simplevalues_only.simplestringkeys_only
|
|
1191
1229
|
},
|
|
1192
1230
|
'adapter_datamapper' => {
|
|
1193
1231
|
:build => 'Moneta::Adapters::DataMapper.new(:setup => "mysql://root:@localhost/moneta", :table => "adapter_datamapper")',
|
|
@@ -1307,7 +1345,7 @@ end}
|
|
|
1307
1345
|
},
|
|
1308
1346
|
'adapter_mongo' => {
|
|
1309
1347
|
:build => 'Moneta::Adapters::Mongo.new(:db => "adapter_mongo")',
|
|
1310
|
-
:specs => ADAPTER_SPECS.with_native_expires,
|
|
1348
|
+
:specs => ADAPTER_SPECS.with_native_expires.simplevalues_only,
|
|
1311
1349
|
:tests => %{
|
|
1312
1350
|
it 'automatically deletes expired document' do
|
|
1313
1351
|
store.store('key', 'val', :expires => 5)
|
|
@@ -1318,7 +1356,7 @@ end}
|
|
|
1318
1356
|
},
|
|
1319
1357
|
'adapter_mongo_with_default_expires' => {
|
|
1320
1358
|
:build => %{Moneta::Adapters::Mongo.new(:expires => 1)},
|
|
1321
|
-
:specs => ADAPTER_SPECS.with_expires.with_default_expires
|
|
1359
|
+
:specs => ADAPTER_SPECS.with_expires.with_default_expires.simplevalues_only
|
|
1322
1360
|
},
|
|
1323
1361
|
'adapter_pstore' => {
|
|
1324
1362
|
:build => 'Moneta::Adapters::PStore.new(:file => File.join(make_tempdir, "adapter_pstore"))',
|
|
@@ -1606,8 +1644,10 @@ SPECS = {}
|
|
|
1606
1644
|
KEYS = {
|
|
1607
1645
|
'nil' => [0, 'nil'],
|
|
1608
1646
|
'integer' => [-10, 42],
|
|
1647
|
+
'number' => [0.5, -0.3, 1<<127, 99],
|
|
1609
1648
|
'boolean' => [true, false],
|
|
1610
|
-
'string' =>
|
|
1649
|
+
'string' => %w(strkey1 strkey2 foo/bar bar/foo/baz).map(&:inspect),
|
|
1650
|
+
'simplestring' => %w(strkey1 strkey2).map(&:inspect),
|
|
1611
1651
|
'object' => ['Value.new(:objkey1)', 'Value.new(:objkey2)'],
|
|
1612
1652
|
'hash' => [{'hashkey1' => 'hashkey2'}, {'hashkey3' => 'hashkey4'}].map(&:inspect)
|
|
1613
1653
|
}
|
|
@@ -1615,19 +1655,24 @@ KEYS = {
|
|
|
1615
1655
|
VALUES = {
|
|
1616
1656
|
'nil' => [0, 'nil'],
|
|
1617
1657
|
'integer' => [41, -12],
|
|
1658
|
+
'number' => [123.456, -98.7, 1<<128, 33],
|
|
1618
1659
|
'boolean' => [true, false],
|
|
1619
|
-
'string' =>
|
|
1660
|
+
'string' => %w(strval1 strval2).map(&:inspect),
|
|
1620
1661
|
'hash' => [{'hashval1' => ['array1', 1]}, {'hashval3' => ['array2', {'hashval4' => 42}]}].map(&:inspect),
|
|
1621
1662
|
'object' => ['Value.new(:objval1)', 'Value.new(:objval2)'],
|
|
1622
1663
|
}
|
|
1623
1664
|
|
|
1624
|
-
KEYS.each do |key_type,
|
|
1625
|
-
VALUES.each do |val_type,
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1665
|
+
KEYS.each do |key_type, keys|
|
|
1666
|
+
VALUES.each do |val_type, vals|
|
|
1667
|
+
(keys.size/2).times do |k|
|
|
1668
|
+
keypair = keys[2*k,2]
|
|
1669
|
+
(vals.size/2).times do |v|
|
|
1670
|
+
valpair = vals[2*v,2]
|
|
1671
|
+
4.times do |i|
|
|
1672
|
+
key1, key2 = i % 2 == 0 ? keypair : keypair.reverse
|
|
1673
|
+
val1, val2 = i < 2 ? valpair : valpair.reverse
|
|
1674
|
+
|
|
1675
|
+
code = %{it 'reads from keys like a Hash' do
|
|
1631
1676
|
store[#{key1}].should be_nil
|
|
1632
1677
|
store.load(#{key1}).should be_nil
|
|
1633
1678
|
end
|
|
@@ -1677,9 +1722,9 @@ it 'accepts frozen options' do
|
|
|
1677
1722
|
store.clear(options).should equal(store)
|
|
1678
1723
|
store.store(#{key1}, #{val1}, options).should == #{val1}
|
|
1679
1724
|
end}
|
|
1680
|
-
|
|
1725
|
+
(SPECS["null_#{key_type}key_#{val_type}value"] ||= []) << code
|
|
1681
1726
|
|
|
1682
|
-
|
|
1727
|
+
code = %{it 'writes values to keys that like a Hash' do
|
|
1683
1728
|
store[#{key1}] = #{val1}
|
|
1684
1729
|
store[#{key1}].should == #{val1}
|
|
1685
1730
|
store.load(#{key1}).should == #{val1}
|
|
@@ -1717,10 +1762,22 @@ it 'overwrites existing values' do
|
|
|
1717
1762
|
store[#{key1}].should == #{val1}
|
|
1718
1763
|
store[#{key1}] = #{val2}
|
|
1719
1764
|
store[#{key1}].should == #{val2}
|
|
1765
|
+
end
|
|
1766
|
+
|
|
1767
|
+
it 'stores frozen values' do
|
|
1768
|
+
value = #{val1}.freeze
|
|
1769
|
+
(store[#{key1}] = value).should equal(value)
|
|
1770
|
+
store[#{key1}].should == #{val1}
|
|
1771
|
+
end
|
|
1772
|
+
|
|
1773
|
+
it 'stores frozen keys' do
|
|
1774
|
+
key = #{key1}.freeze
|
|
1775
|
+
store[key] = #{val1}
|
|
1776
|
+
store[#{key1}].should == #{val1}
|
|
1720
1777
|
end}
|
|
1721
1778
|
|
|
1722
|
-
|
|
1723
|
-
|
|
1779
|
+
if val_type != 'nil'
|
|
1780
|
+
code << %{
|
|
1724
1781
|
it 'fetches a key with a default value with fetch, if the key is available' do
|
|
1725
1782
|
store[#{key1}] = #{val1}
|
|
1726
1783
|
store.fetch(#{key1}, #{val2}).should == #{val1}
|
|
@@ -1732,11 +1789,11 @@ it 'does not run the block in fetch if the key is available' do
|
|
|
1732
1789
|
store.fetch(#{key1}) { unaltered = 'altered' }
|
|
1733
1790
|
unaltered.should == 'unaltered'
|
|
1734
1791
|
end}
|
|
1735
|
-
|
|
1792
|
+
end
|
|
1736
1793
|
|
|
1737
|
-
|
|
1794
|
+
(SPECS["store_#{key_type}key_#{val_type}value"] ||= []) << code
|
|
1738
1795
|
|
|
1739
|
-
|
|
1796
|
+
if val_type != 'boolean' && val_type != 'nil' && val_type != 'integer' && val_type != 'number'
|
|
1740
1797
|
(SPECS["returndifferent_#{key_type}key_#{val_type}value"] ||= []) << %{it 'guarantees that a different value is retrieved' do
|
|
1741
1798
|
value = #{val1}
|
|
1742
1799
|
store[#{key1}] = value
|
|
@@ -1747,15 +1804,17 @@ end}
|
|
|
1747
1804
|
store[#{key1}] = value
|
|
1748
1805
|
store[#{key1}].should be_equal(value)
|
|
1749
1806
|
end}
|
|
1750
|
-
|
|
1807
|
+
end
|
|
1751
1808
|
|
|
1752
|
-
|
|
1809
|
+
code = %{it 'persists values' do
|
|
1753
1810
|
store[#{key1}] = #{val1}
|
|
1754
1811
|
store.close
|
|
1755
1812
|
@store = nil
|
|
1756
1813
|
store[#{key1}].should == #{val1}
|
|
1757
1814
|
end}
|
|
1758
|
-
|
|
1815
|
+
(SPECS["persist_#{key_type}key_#{val_type}value"] ||= []) << code
|
|
1816
|
+
end
|
|
1817
|
+
end
|
|
1759
1818
|
end
|
|
1760
1819
|
end
|
|
1761
1820
|
end
|
data/script/install-bundle
CHANGED
|
@@ -16,7 +16,7 @@ end
|
|
|
16
16
|
|
|
17
17
|
BUNDLE_FILE = "moneta-bundle-#{RUBY_VERSION}-#{ruby}.tar.gz"
|
|
18
18
|
|
|
19
|
-
if system("
|
|
19
|
+
if system("curl -u moneta:#{ENV['DAV_PW']} -k -o #{BUNDLE_FILE} https://mendler.net/dav/#{BUNDLE_FILE}")
|
|
20
20
|
cmd 'rm -rf .bundle'
|
|
21
21
|
cmd "tar -xpf #{BUNDLE_FILE}"
|
|
22
22
|
cmd "rm -f #{BUNDLE_FILE}"
|
data/script/start-services
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
sudo service riak start
|
|
3
|
-
sudo service couchdb start
|
|
4
|
-
sudo service redis-server start
|
|
5
|
-
sudo service cassandra start
|
|
6
|
-
sudo service memcached start
|
|
7
|
-
sudo service mongodb start
|
|
8
2
|
|
|
9
3
|
echo 'Starting TokyoTyrant'
|
|
10
4
|
/usr/sbin/ttserver -dmn -pid /tmp/ttserver.pid -log /tmp/ttserver.log -port 1978
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
sudo service riak start &
|
|
7
|
+
sudo service couchdb start &
|
|
8
|
+
sudo service redis-server start &
|
|
9
|
+
sudo service cassandra start &
|
|
10
|
+
sudo service memcached start &
|
|
11
|
+
sudo service mongodb start &
|