juno 0.2.3 → 0.2.4
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.
- data/.travis.yml +2 -4
- data/Gemfile +3 -1
- data/README.md +40 -8
- data/benchmarks/run.rb +17 -5
- data/lib/juno/adapters/activerecord.rb +23 -14
- data/lib/juno/adapters/cassandra.rb +11 -0
- data/lib/juno/adapters/couch.rb +9 -0
- data/lib/juno/adapters/datamapper.rb +10 -0
- data/lib/juno/adapters/dbm.rb +8 -0
- data/lib/juno/adapters/file.rb +2 -0
- data/lib/juno/adapters/fog.rb +9 -0
- data/lib/juno/adapters/gdbm.rb +8 -0
- data/lib/juno/adapters/localmemcache.rb +8 -0
- data/lib/juno/adapters/lruhash.rb +8 -0
- data/lib/juno/adapters/memcached_dalli.rb +9 -0
- data/lib/juno/adapters/memcached_native.rb +10 -0
- data/lib/juno/adapters/memory.rb +2 -0
- data/lib/juno/adapters/mongo.rb +11 -0
- data/lib/juno/adapters/null.rb +2 -0
- data/lib/juno/adapters/pstore.rb +9 -2
- data/lib/juno/adapters/redis.rb +5 -0
- data/lib/juno/adapters/riak.rb +9 -0
- data/lib/juno/adapters/sdbm.rb +8 -0
- data/lib/juno/adapters/sequel.rb +10 -0
- data/lib/juno/adapters/sqlite.rb +9 -0
- data/lib/juno/adapters/tokyocabinet.rb +16 -4
- data/lib/juno/adapters/yaml.rb +2 -0
- data/lib/juno/base.rb +1 -0
- data/lib/juno/builder.rb +2 -0
- data/lib/juno/cache.rb +2 -0
- data/lib/juno/expires.rb +1 -0
- data/lib/juno/lock.rb +37 -0
- data/lib/juno/proxy.rb +1 -0
- data/lib/juno/stack.rb +2 -0
- data/lib/juno/transformer.rb +16 -4
- data/lib/juno/version.rb +3 -1
- data/lib/juno.rb +33 -2
- data/spec/adapter_activerecord_spec.rb +20 -34
- data/spec/adapter_cassandra_spec.rb +9 -23
- data/spec/adapter_couch_spec.rb +9 -23
- data/spec/adapter_datamapper_spec.rb +36 -50
- data/spec/adapter_dbm_spec.rb +9 -23
- data/spec/adapter_file_spec.rb +9 -23
- data/spec/adapter_fog_spec.rb +12 -29
- data/spec/adapter_gdbm_spec.rb +9 -23
- data/spec/adapter_localmemcache_spec.rb +9 -23
- data/spec/adapter_lruhash_spec.rb +24 -38
- data/spec/adapter_memcached_dalli_spec.rb +10 -24
- data/spec/adapter_memcached_native_spec.rb +10 -24
- data/spec/adapter_memcached_spec.rb +10 -24
- data/spec/adapter_memory_spec.rb +24 -38
- data/spec/adapter_mongo_spec.rb +9 -23
- data/spec/adapter_pstore_spec.rb +12 -26
- data/spec/adapter_redis_spec.rb +10 -24
- data/spec/adapter_riak_spec.rb +9 -23
- data/spec/adapter_sdbm_spec.rb +9 -23
- data/spec/adapter_sequel_spec.rb +9 -23
- data/spec/adapter_sqlite_spec.rb +9 -23
- data/spec/adapter_tokyocabinet_bdb_spec.rb +13 -0
- data/spec/adapter_tokyocabinet_hdb_spec.rb +13 -0
- data/spec/adapter_yaml_spec.rb +12 -26
- data/spec/cache_file_memory_spec.rb +22 -43
- data/spec/cache_memory_null_spec.rb +13 -34
- data/spec/expires_file_spec.rb +56 -76
- data/spec/expires_memory_spec.rb +35 -54
- data/spec/generate.rb +147 -160
- data/spec/helper.rb +39 -0
- data/spec/junospecs.rb +612 -610
- data/spec/lock_spec.rb +31 -0
- data/spec/null_adapter_spec.rb +15 -29
- data/spec/proxy_expires_memory_spec.rb +37 -58
- data/spec/proxy_redis_spec.rb +13 -33
- data/spec/simple_activerecord_spec.rb +34 -48
- data/spec/simple_activerecord_with_expires_spec.rb +35 -49
- data/spec/simple_cassandra_spec.rb +35 -49
- data/spec/simple_couch_spec.rb +34 -48
- data/spec/simple_couch_with_expires_spec.rb +35 -49
- data/spec/simple_datamapper_spec.rb +34 -48
- data/spec/simple_datamapper_with_expires_spec.rb +35 -49
- data/spec/simple_datamapper_with_repository_spec.rb +34 -48
- data/spec/simple_dbm_spec.rb +34 -48
- data/spec/simple_dbm_with_expires_spec.rb +35 -49
- data/spec/simple_file_spec.rb +34 -48
- data/spec/simple_file_with_expires_spec.rb +35 -49
- data/spec/simple_fog_spec.rb +37 -54
- data/spec/simple_fog_with_expires_spec.rb +39 -57
- data/spec/simple_gdbm_spec.rb +34 -48
- data/spec/simple_gdbm_with_expires_spec.rb +35 -49
- data/spec/simple_hashfile_spec.rb +34 -48
- data/spec/simple_hashfile_with_expires_spec.rb +35 -49
- data/spec/simple_localmemcache_spec.rb +34 -48
- data/spec/simple_localmemcache_with_expires_spec.rb +35 -49
- data/spec/simple_lruhash_spec.rb +34 -48
- data/spec/simple_lruhash_with_expires_spec.rb +35 -49
- data/spec/simple_memcached_dalli_spec.rb +35 -49
- data/spec/simple_memcached_native_spec.rb +35 -49
- data/spec/simple_memcached_spec.rb +35 -49
- data/spec/simple_memory_spec.rb +34 -48
- data/spec/simple_memory_with_expires_spec.rb +35 -49
- data/spec/simple_mongo_spec.rb +34 -48
- data/spec/simple_mongo_with_expires_spec.rb +35 -49
- data/spec/simple_null_spec.rb +25 -39
- data/spec/simple_pstore_spec.rb +34 -48
- data/spec/simple_pstore_with_expires_spec.rb +35 -49
- data/spec/simple_redis_spec.rb +35 -49
- data/spec/simple_riak_spec.rb +34 -48
- data/spec/simple_riak_with_expires_spec.rb +35 -49
- data/spec/simple_sdbm_spec.rb +34 -48
- data/spec/simple_sdbm_with_expires_spec.rb +35 -49
- data/spec/simple_sequel_spec.rb +34 -48
- data/spec/simple_sequel_with_expires_spec.rb +35 -49
- data/spec/simple_sqlite_spec.rb +34 -48
- data/spec/simple_sqlite_with_expires_spec.rb +35 -49
- data/spec/simple_tokyocabinet_spec.rb +34 -48
- data/spec/simple_tokyocabinet_with_expires_spec.rb +35 -49
- data/spec/simple_yaml_spec.rb +34 -48
- data/spec/simple_yaml_with_expires_spec.rb +35 -49
- data/spec/stack_file_memory_spec.rb +15 -38
- data/spec/stack_memory_file_spec.rb +14 -37
- data/spec/transformer_bson_spec.rb +20 -39
- data/spec/transformer_compress_spec.rb +17 -36
- data/spec/transformer_json_spec.rb +20 -39
- data/spec/transformer_marshal_base64_spec.rb +36 -55
- data/spec/transformer_marshal_escape_spec.rb +36 -55
- data/spec/transformer_marshal_md5_spec.rb +36 -55
- data/spec/transformer_marshal_md5_spread_spec.rb +36 -55
- data/spec/transformer_msgpack_spec.rb +20 -39
- data/spec/transformer_ox_spec.rb +40 -0
- data/spec/transformer_yaml_spec.rb +35 -54
- metadata +11 -6
- data/spec/adapter_tokyocabinet_spec.rb +0 -27
- data/spec/simpl_memory_with_expires_spec.rb +0 -53
data/.travis.yml
CHANGED
|
@@ -10,12 +10,10 @@ services:
|
|
|
10
10
|
- couchdb
|
|
11
11
|
- redis-server
|
|
12
12
|
# - cassandra
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
- memcached
|
|
14
|
+
- mongodb
|
|
15
15
|
before_install:
|
|
16
16
|
- sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev # tokyotyrant
|
|
17
|
-
- sudo /bin/bash /etc/init.d/mongodb start
|
|
18
|
-
- memcached -d -p 22122
|
|
19
17
|
env:
|
|
20
18
|
- "TASK=test:parallel"
|
|
21
19
|
- "TASK=test:non_parallel"
|
data/Gemfile
CHANGED
|
@@ -17,7 +17,7 @@ gem 'dm-core'
|
|
|
17
17
|
gem 'dm-migrations'
|
|
18
18
|
gem 'dm-sqlite-adapter'
|
|
19
19
|
gem 'fog'
|
|
20
|
-
gem 'activerecord'
|
|
20
|
+
gem 'activerecord', '>= 3.2.9'
|
|
21
21
|
gem 'redis'
|
|
22
22
|
gem 'mongo'
|
|
23
23
|
gem 'couchrest'
|
|
@@ -35,6 +35,8 @@ else
|
|
|
35
35
|
gem 'tokyocabinet'
|
|
36
36
|
gem 'memcached'
|
|
37
37
|
gem 'sqlite3'
|
|
38
|
+
gem 'ox'
|
|
39
|
+
gem 'bson_ext'
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
#gem 'cassandra'
|
data/README.md
CHANGED
|
@@ -7,7 +7,18 @@ Juno provides a standard interface for interacting with various kinds of key/val
|
|
|
7
7
|
is based on Moneta and replaces it with a mostly compatible interface. The reason for the
|
|
8
8
|
fork was that Moneta was unmaintained for a long time.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Juno is very feature rich:
|
|
11
|
+
|
|
12
|
+
* Supports for a lot of backends (See below)
|
|
13
|
+
* Supports proxies (Similar to [Rack middlewares](http://rack.rubyforge.org/))
|
|
14
|
+
* Custom serialization via `Juno::Transformer` proxy (Marshal/JSON/YAML and many more)
|
|
15
|
+
* Custom key transformation via `Juno::Transformer` proxy
|
|
16
|
+
* Expiration for all stores (Added via proxy if not supported natively)
|
|
17
|
+
|
|
18
|
+
Supported backends
|
|
19
|
+
------------------
|
|
20
|
+
|
|
21
|
+
Out of the box, it supports the following backends:
|
|
11
22
|
|
|
12
23
|
* Memory:
|
|
13
24
|
* In-memory store (:Memory)
|
|
@@ -39,14 +50,27 @@ Out of the box, it supports:
|
|
|
39
50
|
* Fog cloud storage which supports Amazon S3, Rackspace, etc. (:Fog)
|
|
40
51
|
* Storage which doesn't store anything (:Null)
|
|
41
52
|
|
|
53
|
+
Supported serializers:
|
|
54
|
+
|
|
55
|
+
* Marshal
|
|
56
|
+
* YAML
|
|
57
|
+
* JSON (via multi_json)
|
|
58
|
+
* MessagePack
|
|
59
|
+
* BSON
|
|
60
|
+
* Ox
|
|
61
|
+
|
|
62
|
+
Proxies
|
|
63
|
+
-------
|
|
64
|
+
|
|
42
65
|
In addition it supports proxies (Similar to [Rack middlewares](http://rack.rubyforge.org/)) which
|
|
43
66
|
add additional features to storage backends:
|
|
44
67
|
|
|
45
|
-
* Juno::Proxy proxy base class
|
|
46
|
-
* Juno::Expires to add expiration support to stores which don't support it natively
|
|
47
|
-
* Juno::Stack to stack multiple stores (Read returns result from first where the key is found, writes go to all stores)
|
|
48
|
-
* Juno::Transformer transforms keys and values (Marshal, YAML, JSON, Base64, MD5, ...)
|
|
49
|
-
* Juno::Cache combine two stores, one as backend and one as cache (e.g. Juno::Adapters::File + Juno::Adapters::Memory)
|
|
68
|
+
* `Juno::Proxy` proxy base class
|
|
69
|
+
* `Juno::Expires` to add expiration support to stores which don't support it natively
|
|
70
|
+
* `Juno::Stack` to stack multiple stores (Read returns result from first where the key is found, writes go to all stores)
|
|
71
|
+
* `Juno::Transformer` transforms keys and values (Marshal, YAML, JSON, Base64, MD5, ...)
|
|
72
|
+
* `Juno::Cache` combine two stores, one as backend and one as cache (e.g. Juno::Adapters::File + Juno::Adapters::Memory)
|
|
73
|
+
* `Juno::Lock` to make store thread safe
|
|
50
74
|
|
|
51
75
|
The Juno API is purposely extremely similar to the Hash API. In order so support an
|
|
52
76
|
identical API across stores, it does not support iteration or partial matches.
|
|
@@ -60,8 +84,8 @@ Links
|
|
|
60
84
|
* Latest Gem: <http://rubydoc.info/gems/juno/frames>
|
|
61
85
|
* GitHub master: <http://rubydoc.info/github/minad/juno/master/frames>
|
|
62
86
|
|
|
63
|
-
|
|
64
|
-
|
|
87
|
+
Juno API
|
|
88
|
+
--------
|
|
65
89
|
|
|
66
90
|
~~~
|
|
67
91
|
#initialize(options) options differs per-store, and is used to set up the store
|
|
@@ -144,6 +168,14 @@ cache = Juno.build do
|
|
|
144
168
|
end
|
|
145
169
|
~~~
|
|
146
170
|
|
|
171
|
+
Alternatives
|
|
172
|
+
------------
|
|
173
|
+
|
|
174
|
+
* [Moneta](https://github.com/wycats/moneta): Juno is based on Moneta, but Juno supports more features and more backends and is actively developed
|
|
175
|
+
* [Horcrux](https://github.com/technoweenie/horcrux): Used at github, supports batch operations but only Memcached backend
|
|
176
|
+
* [ToyStore](https://github.com/jnunemaker/toystore): ORM mapper for key/value stores
|
|
177
|
+
* [ToyStore Adapter](https://github.com/jnunemaker/adapter): Adapter to key/value stores used by ToyStore, Juno can be used directly with the ToyStore Memory adapter
|
|
178
|
+
|
|
147
179
|
Authors
|
|
148
180
|
-------
|
|
149
181
|
|
data/benchmarks/run.rb
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
|
2
4
|
require 'benchmark'
|
|
3
5
|
require 'juno'
|
|
4
|
-
require 'dm-core'
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
begin
|
|
8
|
+
require 'dm-core'
|
|
9
|
+
DataMapper.setup(:default, :adapter => :in_memory)
|
|
10
|
+
rescue LoadError
|
|
11
|
+
end
|
|
7
12
|
|
|
8
13
|
# Hacked arrays
|
|
9
14
|
# Array modifications
|
|
@@ -37,7 +42,7 @@ stores = {
|
|
|
37
42
|
:Redis => { },
|
|
38
43
|
:MemcachedDalli => { :server => "localhost:11211", :namespace => 'juno_dalli' },
|
|
39
44
|
:MemcachedNative => { :server => "localhost:11211", :namespace => 'juno_native' },
|
|
40
|
-
|
|
45
|
+
:Mongo => { :host => 'localhost', :port => 27017, :db => 'juno_bench' },
|
|
41
46
|
:LocalMemCache => { :file => "bench.lmc" },
|
|
42
47
|
:DBM => { :file => "bench.dbm" },
|
|
43
48
|
:SDBM => { :file => "bench.sdbm" },
|
|
@@ -51,7 +56,7 @@ stores = {
|
|
|
51
56
|
:DataMapper => { :setup => "sqlite3::memory:" },
|
|
52
57
|
:ActiveRecord => { :connection => { :adapter => 'sqlite3', :database => ':memory:' } },
|
|
53
58
|
:Sequel => { :db => "sqlite:/" },
|
|
54
|
-
|
|
59
|
+
:Couch => {:db => "couch_test"},
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
stats, keys, data, errors, summary = {}, [], HackedArray.new, HackedArray.new, HackedArray.new
|
|
@@ -93,10 +98,17 @@ puts "Lenght Stats % 10i % 10i % 10i % 10i " % [vlen_min, vlen_max, vlen_ttl,
|
|
|
93
98
|
|
|
94
99
|
|
|
95
100
|
stores.each do |name, options|
|
|
101
|
+
begin
|
|
102
|
+
@cache = Juno.new(name, options)
|
|
103
|
+
@cache['test'] = 'test'
|
|
104
|
+
@cache.clear
|
|
105
|
+
rescue Exception => ex
|
|
106
|
+
puts "#{name} not benchmarked - #{ex.message}"
|
|
107
|
+
next
|
|
108
|
+
end
|
|
96
109
|
puts "======================================================================"
|
|
97
110
|
puts name
|
|
98
111
|
puts "----------------------------------------------------------------------"
|
|
99
|
-
@cache = Juno.new(name, options)
|
|
100
112
|
stats[name] = {
|
|
101
113
|
:writes => [],
|
|
102
114
|
:reads => [],
|
|
@@ -2,6 +2,8 @@ require 'active_record'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# ActiveRecord as key/value stores
|
|
6
|
+
# @api public
|
|
5
7
|
class ActiveRecord < Base
|
|
6
8
|
def self.tables
|
|
7
9
|
@tables ||= {}
|
|
@@ -9,18 +11,28 @@ module Juno
|
|
|
9
11
|
|
|
10
12
|
attr_reader :table
|
|
11
13
|
|
|
14
|
+
# Constructor
|
|
15
|
+
#
|
|
16
|
+
# @param [Hash] options
|
|
17
|
+
#
|
|
18
|
+
# Options:
|
|
19
|
+
# * :table - Table name (default juno)
|
|
20
|
+
# * :connection - ActiveRecord connection
|
|
12
21
|
def initialize(options = {})
|
|
13
22
|
table = options[:table] || 'juno'
|
|
14
|
-
@table = self.class.tables[table] ||=
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
@table = self.class.tables[table] ||=
|
|
24
|
+
begin
|
|
25
|
+
c = Class.new(::ActiveRecord::Base)
|
|
26
|
+
c.table_name = table
|
|
27
|
+
c.primary_key = :k
|
|
28
|
+
c
|
|
29
|
+
end
|
|
19
30
|
@table.establish_connection(options[:connection]) if options[:connection]
|
|
20
31
|
unless @table.table_exists?
|
|
21
|
-
@table.connection.create_table(@table.table_name) do |t|
|
|
22
|
-
|
|
23
|
-
t.
|
|
32
|
+
@table.connection.create_table(@table.table_name, :id => false) do |t|
|
|
33
|
+
# Do not use binary columns (Issue #17)
|
|
34
|
+
t.string :k, :null => false
|
|
35
|
+
t.string :v
|
|
24
36
|
end
|
|
25
37
|
@table.connection.add_index(@table.table_name, :k, :unique => true)
|
|
26
38
|
end
|
|
@@ -39,19 +51,16 @@ module Juno
|
|
|
39
51
|
@table.transaction do
|
|
40
52
|
record = @table.find_by_k(key)
|
|
41
53
|
if record
|
|
42
|
-
value = record.v
|
|
43
54
|
record.destroy
|
|
44
|
-
|
|
55
|
+
record.v
|
|
45
56
|
end
|
|
46
57
|
end
|
|
47
58
|
end
|
|
48
59
|
|
|
49
60
|
def store(key, value, options = {})
|
|
50
61
|
@table.transaction do
|
|
51
|
-
record = @table.
|
|
52
|
-
record
|
|
53
|
-
record.v = value
|
|
54
|
-
record.save!
|
|
62
|
+
record = @table.find_or_initialize_by_k(key)
|
|
63
|
+
record.update_attributes(:v => value)
|
|
55
64
|
value
|
|
56
65
|
end
|
|
57
66
|
end
|
|
@@ -5,7 +5,18 @@ require 'cassandra'
|
|
|
5
5
|
|
|
6
6
|
module Juno
|
|
7
7
|
module Adapters
|
|
8
|
+
# Cassandra backend
|
|
9
|
+
# @api public
|
|
8
10
|
class Cassandra < Base
|
|
11
|
+
# Constructor
|
|
12
|
+
#
|
|
13
|
+
# @param [Hash] options
|
|
14
|
+
#
|
|
15
|
+
# Options:
|
|
16
|
+
# * :keyspace - Cassandra keyspace (default Juno)
|
|
17
|
+
# * :column_family - Cassandra column family (default :Juno)
|
|
18
|
+
# * :host - Server host name (default 127.0.0.1)
|
|
19
|
+
# * :port - Server port (default 9160)
|
|
9
20
|
def initialize(options = {})
|
|
10
21
|
options[:keyspace] ||= 'Juno'
|
|
11
22
|
options[:host] ||= '127.0.0.1'
|
data/lib/juno/adapters/couch.rb
CHANGED
|
@@ -2,8 +2,17 @@ require 'couchrest'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# CouchDB backend
|
|
6
|
+
# @api public
|
|
5
7
|
class Couch < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :db - Couch database
|
|
6
14
|
def initialize(options = {})
|
|
15
|
+
raise 'No option :db specified' unless options[:db]
|
|
7
16
|
@db = ::CouchRest.database!(options[:db])
|
|
8
17
|
end
|
|
9
18
|
|
|
@@ -3,6 +3,8 @@ require 'dm-migrations'
|
|
|
3
3
|
|
|
4
4
|
module Juno
|
|
5
5
|
module Adapters
|
|
6
|
+
# Datamapper backend
|
|
7
|
+
# @api public
|
|
6
8
|
class DataMapper < Base
|
|
7
9
|
class Store
|
|
8
10
|
include ::DataMapper::Resource
|
|
@@ -10,6 +12,14 @@ module Juno
|
|
|
10
12
|
property :v, Object, :lazy => false
|
|
11
13
|
end
|
|
12
14
|
|
|
15
|
+
# Constructor
|
|
16
|
+
#
|
|
17
|
+
# @param [Hash] options
|
|
18
|
+
#
|
|
19
|
+
# Options:
|
|
20
|
+
# * :setup - Datamapper setup string
|
|
21
|
+
# * :repository - Repository name (default :juno)
|
|
22
|
+
# * :table - Table name (default :juno)
|
|
13
23
|
def initialize(options = {})
|
|
14
24
|
raise 'No option :setup specified' unless options[:setup]
|
|
15
25
|
@repository = options.delete(:repository) || :juno
|
data/lib/juno/adapters/dbm.rb
CHANGED
|
@@ -2,7 +2,15 @@ require 'dbm'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# DBM backend (Berkeley DB)
|
|
6
|
+
# @api public
|
|
5
7
|
class DBM < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
raise 'No option :file specified' unless options[:file]
|
|
8
16
|
@memory = ::DBM.new(options[:file])
|
data/lib/juno/adapters/file.rb
CHANGED
data/lib/juno/adapters/fog.rb
CHANGED
|
@@ -2,7 +2,16 @@ require 'fog'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# Fog backend (Cloud storage services)
|
|
6
|
+
# @api public
|
|
5
7
|
class Fog < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :dir - Fog directory
|
|
14
|
+
# * Other options passed to Fog::Storage#new
|
|
6
15
|
def initialize(options = {})
|
|
7
16
|
raise 'No option :dir specified' unless dir = options.delete(:dir)
|
|
8
17
|
storage = ::Fog::Storage.new(options)
|
data/lib/juno/adapters/gdbm.rb
CHANGED
|
@@ -2,7 +2,15 @@ require 'gdbm'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# GDBM backend
|
|
6
|
+
# @api public
|
|
5
7
|
class GDBM < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
raise 'No option :file specified' unless options[:file]
|
|
8
16
|
@memory = ::GDBM.new(options[:file])
|
|
@@ -2,7 +2,15 @@ require 'localmemcache'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# LocalMemCache backend
|
|
6
|
+
# @api public
|
|
5
7
|
class LocalMemCache < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
raise 'No option :file specified' unless options[:file]
|
|
8
16
|
@memory = ::LocalMemCache.new(:filename => options[:file])
|
|
@@ -2,7 +2,15 @@ require 'hashery/lru_hash'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# LRUHash backend
|
|
6
|
+
# @api public
|
|
5
7
|
class LRUHash < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :max_size - Maximum size of hash (default 1024)
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
@memory = Hashery::LRUHash.new(options[:max_size] || 1024)
|
|
8
16
|
end
|
|
@@ -2,7 +2,16 @@ require 'dalli'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# Memcached backend (using gem dalli)
|
|
6
|
+
# @api public
|
|
5
7
|
class MemcachedDalli < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :server - Memcached server (default localhost:11211)
|
|
14
|
+
# * Other options passed to Dalli::Client#new
|
|
6
15
|
def initialize(options = {})
|
|
7
16
|
server = options.delete(:server) || 'localhost:11211'
|
|
8
17
|
@cache = ::Dalli::Client.new(server, options)
|
|
@@ -2,7 +2,17 @@ require 'memcached'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# Memcached backend (using gem memcached)
|
|
6
|
+
# @api public
|
|
5
7
|
class MemcachedNative < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :server - Memcached server (default localhost:11211)
|
|
14
|
+
# * :namespace - Key namespace
|
|
15
|
+
# * Other options passed to Memcached#new
|
|
6
16
|
def initialize(options = {})
|
|
7
17
|
server = options.delete(:server) || 'localhost:11211'
|
|
8
18
|
options.merge!(:prefix_key => options.delete(:namespace)) if options[:namespace]
|
data/lib/juno/adapters/memory.rb
CHANGED
data/lib/juno/adapters/mongo.rb
CHANGED
|
@@ -2,7 +2,18 @@ require 'mongo'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# MongoDB backend
|
|
6
|
+
# @api public
|
|
5
7
|
class Mongo < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :collection - MongoDB collection name (default juno)
|
|
14
|
+
# * :host - MongoDB server host (default localhost)
|
|
15
|
+
# * :port - MongoDB server port (default mongodb default port)
|
|
16
|
+
# * :db - MongoDB database (default juno)
|
|
6
17
|
def initialize(options = {})
|
|
7
18
|
collection = options.delete(:collection) || 'juno'
|
|
8
19
|
host = options.delete(:host) || 'localhost'
|
data/lib/juno/adapters/null.rb
CHANGED
data/lib/juno/adapters/pstore.rb
CHANGED
|
@@ -2,7 +2,15 @@ require 'pstore'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# PStore backend
|
|
6
|
+
# @api public
|
|
5
7
|
class PStore < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - PStore file
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
raise 'No option :file specified' unless options[:file]
|
|
8
16
|
FileUtils.mkpath(::File.dirname(options[:file]))
|
|
@@ -38,8 +46,7 @@ module Juno
|
|
|
38
46
|
|
|
39
47
|
if RUBY_VERSION > '1.9'
|
|
40
48
|
def new_store(options)
|
|
41
|
-
|
|
42
|
-
::PStore.new(options[:file], options.include?(:thread_safe) ? options[:thread_safe] : true)
|
|
49
|
+
::PStore.new(options[:file], options[:threadsafe])
|
|
43
50
|
end
|
|
44
51
|
else
|
|
45
52
|
def new_store(options)
|
data/lib/juno/adapters/redis.rb
CHANGED
data/lib/juno/adapters/riak.rb
CHANGED
|
@@ -5,7 +5,16 @@ require 'riak'
|
|
|
5
5
|
|
|
6
6
|
module Juno
|
|
7
7
|
module Adapters
|
|
8
|
+
# Riak backend
|
|
9
|
+
# @api public
|
|
8
10
|
class Riak < Base
|
|
11
|
+
# Constructor
|
|
12
|
+
#
|
|
13
|
+
# @param [Hash] options
|
|
14
|
+
#
|
|
15
|
+
# Options:
|
|
16
|
+
# * :bucket - Bucket name (default juno)
|
|
17
|
+
# * All other options passed to Riak::Client#new
|
|
9
18
|
def initialize(options = {})
|
|
10
19
|
bucket = options.delete(:bucket) || 'juno'
|
|
11
20
|
@bucket = ::Riak::Client.new(options).bucket(bucket)
|
data/lib/juno/adapters/sdbm.rb
CHANGED
|
@@ -2,7 +2,15 @@ require 'sdbm'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# SDBM backend
|
|
6
|
+
# @api public
|
|
5
7
|
class SDBM < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
6
14
|
def initialize(options = {})
|
|
7
15
|
raise 'No option :file specified' unless options[:file]
|
|
8
16
|
@memory = ::SDBM.new(options[:file])
|
data/lib/juno/adapters/sequel.rb
CHANGED
|
@@ -2,7 +2,17 @@ require 'sequel'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# Sequel backend
|
|
6
|
+
# @api public
|
|
5
7
|
class Sequel < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :db - Sequel database
|
|
14
|
+
# * :table - Table name (default :juno)
|
|
15
|
+
# * All other options passed to Sequel#connect
|
|
6
16
|
def initialize(options = {})
|
|
7
17
|
raise 'No option :db specified' unless db = options.delete(:db)
|
|
8
18
|
@table = options.delete(:table) || :juno
|
data/lib/juno/adapters/sqlite.rb
CHANGED
|
@@ -2,7 +2,16 @@ require 'sqlite3'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# Sqlite3 backend
|
|
6
|
+
# @api public
|
|
5
7
|
class Sqlite < Base
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
14
|
+
# * :table - Table name (default juno)
|
|
6
15
|
def initialize(options = {})
|
|
7
16
|
raise 'No option :file specified' unless options[:file]
|
|
8
17
|
table = options[:table] || 'juno'
|
|
@@ -2,14 +2,26 @@ require 'tokyocabinet'
|
|
|
2
2
|
|
|
3
3
|
module Juno
|
|
4
4
|
module Adapters
|
|
5
|
+
# TokyoCabinet backend
|
|
6
|
+
# @api public
|
|
5
7
|
class TokyoCabinet < Memory
|
|
8
|
+
# Constructor
|
|
9
|
+
#
|
|
10
|
+
# @param [Hash] options
|
|
11
|
+
#
|
|
12
|
+
# Options:
|
|
13
|
+
# * :file - Database file
|
|
14
|
+
# * :type - Database type (default :hdb, :bdb and :hdb possible)
|
|
6
15
|
def initialize(options = {})
|
|
7
16
|
file = options[:file]
|
|
8
17
|
raise 'No option :file specified' unless options[:file]
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
if options[:type] == :bdb
|
|
19
|
+
@memory = ::TokyoCabinet::BDB.new
|
|
20
|
+
@memory.open(file, ::TokyoCabinet::BDB::OWRITER | ::TokyoCabinet::BDB::OCREAT)
|
|
21
|
+
else
|
|
22
|
+
@memory = ::TokyoCabinet::HDB.new
|
|
23
|
+
@memory.open(file, ::TokyoCabinet::HDB::OWRITER | ::TokyoCabinet::HDB::OCREAT)
|
|
24
|
+
end or raise @memory.errmsg(@memory.ecode)
|
|
13
25
|
end
|
|
14
26
|
|
|
15
27
|
def key?(key, options = {})
|
data/lib/juno/adapters/yaml.rb
CHANGED
data/lib/juno/base.rb
CHANGED
data/lib/juno/builder.rb
CHANGED
data/lib/juno/cache.rb
CHANGED