hella-redis 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/README.md +4 -4
- data/hella-redis.gemspec +2 -2
- data/lib/hella-redis.rb +2 -2
- data/lib/hella-redis/connection.rb +35 -0
- data/lib/hella-redis/connection_spy.rb +58 -0
- data/lib/hella-redis/version.rb +1 -1
- data/test/helper.rb +5 -0
- data/test/support/factory.rb +6 -0
- data/test/unit/connection_spy_tests.rb +100 -0
- data/test/unit/connection_tests.rb +75 -0
- metadata +36 -31
- data/lib/hella-redis/redis_connection.rb +0 -19
- data/test/unit/redis_connection_tests.rb +0 -36
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,18 +4,18 @@ It's-a hella-redis!
|
|
4
4
|
|
5
5
|
## Usage
|
6
6
|
|
7
|
-
###
|
7
|
+
### Connection
|
8
8
|
|
9
9
|
```ruby
|
10
10
|
# config and create a connection
|
11
|
-
@config =
|
11
|
+
@config = {
|
12
12
|
:timeout => 1,
|
13
13
|
:size => 5,
|
14
14
|
:redis_ns => 'hella-redis-test',
|
15
15
|
:driver => 'ruby',
|
16
16
|
:url => 'redis://localhost:6379/0'
|
17
|
-
}
|
18
|
-
@conn = HellaRedis::
|
17
|
+
}
|
18
|
+
@conn = HellaRedis::Connection.new(@config)
|
19
19
|
|
20
20
|
# it's actually a pool of connections
|
21
21
|
@conn.with do |conn|
|
data/hella-redis.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_development_dependency("assert")
|
21
21
|
|
22
|
-
gem.add_dependency("redis", ["~> 3.
|
23
|
-
gem.add_dependency("redis-namespace", ["~> 1.
|
22
|
+
gem.add_dependency("redis", ["~> 3.2"])
|
23
|
+
gem.add_dependency("redis-namespace", ["~> 1.5"])
|
24
24
|
gem.add_dependency("connection_pool", ["= 0.9.2"]) # temp, for 1.8.7 support
|
25
25
|
|
26
26
|
end
|
data/lib/hella-redis.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'connection_pool'
|
2
|
+
require 'redis'
|
3
|
+
require 'redis-namespace'
|
4
|
+
|
5
|
+
module HellaRedis
|
6
|
+
|
7
|
+
module Connection
|
8
|
+
|
9
|
+
def self.new(config)
|
10
|
+
config = Config.new(config) if config.kind_of?(::Hash)
|
11
|
+
::ConnectionPool.new(:timeout => config.timeout, :size => config.size) do
|
12
|
+
::Redis::Namespace.new(config.redis_ns, {
|
13
|
+
:redis => ::Redis.new({
|
14
|
+
:url => config.url,
|
15
|
+
:driver => config.driver
|
16
|
+
})
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Config
|
22
|
+
attr_reader :url, :driver, :redis_ns, :timeout, :size
|
23
|
+
|
24
|
+
def initialize(args)
|
25
|
+
@url = args[:url]
|
26
|
+
@driver = args[:driver]
|
27
|
+
@redis_ns = args[:ns]
|
28
|
+
@timeout = args[:timeout]
|
29
|
+
@size = args[:size] || 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'hella-redis/connection'
|
3
|
+
|
4
|
+
module HellaRedis
|
5
|
+
|
6
|
+
class ConnectionSpy
|
7
|
+
|
8
|
+
attr_reader :config, :redis_spy, :with_calls
|
9
|
+
|
10
|
+
def initialize(config, redis_spy = nil)
|
11
|
+
@config = config
|
12
|
+
@with_calls = []
|
13
|
+
@redis_spy = redis_spy || RedisSpy.new(config)
|
14
|
+
end
|
15
|
+
|
16
|
+
def with(*args, &block)
|
17
|
+
@with_calls << WithCall.new(args, block)
|
18
|
+
block.call(@redis_spy)
|
19
|
+
end
|
20
|
+
|
21
|
+
def redis_calls
|
22
|
+
@redis_spy.calls
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class RedisSpy
|
28
|
+
|
29
|
+
attr_reader :calls
|
30
|
+
|
31
|
+
def initialize(config)
|
32
|
+
# mimic the real conection behavior, accept hash or object
|
33
|
+
config = Connection::Config.new(config) if config.kind_of?(::Hash)
|
34
|
+
@instance = ::Redis.new({
|
35
|
+
:url => config.url,
|
36
|
+
:driver => config.driver
|
37
|
+
})
|
38
|
+
@calls = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_missing(name, *args, &block)
|
42
|
+
if self.respond_to?(name)
|
43
|
+
@calls << RedisCall.new(name, args, block)
|
44
|
+
else
|
45
|
+
super
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def respond_to?(*args)
|
50
|
+
super || @instance.respond_to?(*args)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
WithCall = Struct.new(:args, :block)
|
56
|
+
RedisCall = Struct.new(:command, :args, :block)
|
57
|
+
|
58
|
+
end
|
data/lib/hella-redis/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'hella-redis/connection_spy'
|
3
|
+
|
4
|
+
class HellaRedis::ConnectionSpy
|
5
|
+
|
6
|
+
class UnitTests < Assert::Context
|
7
|
+
setup do
|
8
|
+
@config = {
|
9
|
+
:url => 'redis://localhost:6379/0',
|
10
|
+
:driver => 'ruby'
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
class ConnectionSpyTests < UnitTests
|
17
|
+
desc "HellaRedis::ConnectionSpy"
|
18
|
+
setup do
|
19
|
+
@connection_spy = HellaRedis::ConnectionSpy.new(@config)
|
20
|
+
end
|
21
|
+
subject{ @connection_spy }
|
22
|
+
|
23
|
+
should have_readers :config, :redis_spy, :with_calls
|
24
|
+
should have_imeths :with, :redis_calls
|
25
|
+
|
26
|
+
should "know its config and redis spy" do
|
27
|
+
assert_equal @config, subject.config
|
28
|
+
assert_instance_of HellaRedis::RedisSpy, subject.redis_spy
|
29
|
+
end
|
30
|
+
|
31
|
+
should "default its with calls" do
|
32
|
+
assert_equal [], subject.with_calls
|
33
|
+
end
|
34
|
+
|
35
|
+
should "know its redis spy's calls" do
|
36
|
+
assert_same subject.redis_spy.calls, subject.redis_calls
|
37
|
+
end
|
38
|
+
|
39
|
+
should "yield its redis spy using `with`" do
|
40
|
+
yielded = nil
|
41
|
+
subject.with{ |c| yielded = c }
|
42
|
+
assert_same subject.redis_spy, yielded
|
43
|
+
end
|
44
|
+
|
45
|
+
should "track calls to with" do
|
46
|
+
overrides = { :timeout => Factory.integer }
|
47
|
+
block = proc{ |c| Factory.string }
|
48
|
+
subject.with(overrides, &block)
|
49
|
+
call = subject.with_calls.last
|
50
|
+
assert_equal [overrides], call.args
|
51
|
+
assert_equal block, call.block
|
52
|
+
end
|
53
|
+
|
54
|
+
should "allow passing a custom redis spy" do
|
55
|
+
redis_spy = Factory.string
|
56
|
+
spy = HellaRedis::ConnectionSpy.new(@config, redis_spy)
|
57
|
+
assert_equal redis_spy, spy.redis_spy
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
class RedisSpyTests < UnitTests
|
63
|
+
desc "HellaRedis::RedisSpy"
|
64
|
+
setup do
|
65
|
+
@redis_spy = HellaRedis::RedisSpy.new(@config)
|
66
|
+
end
|
67
|
+
subject{ @redis_spy }
|
68
|
+
|
69
|
+
should have_readers :calls
|
70
|
+
|
71
|
+
should "default its calls" do
|
72
|
+
assert_equal [], subject.calls
|
73
|
+
end
|
74
|
+
|
75
|
+
should "allow passing a config object" do
|
76
|
+
config = OpenStruct.new(@config)
|
77
|
+
assert_nothing_raised{ HellaRedis::RedisSpy.new(config) }
|
78
|
+
end
|
79
|
+
|
80
|
+
should "track redis calls made to it" do
|
81
|
+
assert_true subject.respond_to?(:set)
|
82
|
+
|
83
|
+
key, value = [Factory.string, Factory.string]
|
84
|
+
subject.set(key, value)
|
85
|
+
|
86
|
+
call = subject.calls.first
|
87
|
+
assert_equal :set, call.command
|
88
|
+
assert_equal [key, value], call.args
|
89
|
+
end
|
90
|
+
|
91
|
+
should "raise no method errors for non-redis methods" do
|
92
|
+
assert_false subject.respond_to?(:super_awesome_set)
|
93
|
+
assert_raises(NoMethodError) do
|
94
|
+
subject.super_awesome_set(Factory.string, Factory.string)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'hella-redis/connection'
|
3
|
+
|
4
|
+
require 'connection_pool'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module HellaRedis::Connection
|
8
|
+
|
9
|
+
class UnitTests < Assert::Context
|
10
|
+
desc "HellaRedis::Connection"
|
11
|
+
setup do
|
12
|
+
@config_hash = {
|
13
|
+
:timeout => 1,
|
14
|
+
:size => 5,
|
15
|
+
:redis_ns => 'hella-redis-test',
|
16
|
+
:driver => 'ruby',
|
17
|
+
:url => 'redis://localhost:6379/0'
|
18
|
+
}
|
19
|
+
@conn = HellaRedis::Connection.new(@config_hash)
|
20
|
+
end
|
21
|
+
subject{ @conn }
|
22
|
+
|
23
|
+
should "build a connection pool" do
|
24
|
+
assert_instance_of ::ConnectionPool, subject
|
25
|
+
end
|
26
|
+
|
27
|
+
should "connect to the redis instance that was provided" do
|
28
|
+
assert_nothing_raised do
|
29
|
+
subject.with{ |c| c.info }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
should "build a redis namespace and yield it using `with`" do
|
34
|
+
subject.with do |conn|
|
35
|
+
assert_instance_of ::Redis::Namespace, conn
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
should "allow passing a config object when building a connection" do
|
40
|
+
conn = nil
|
41
|
+
assert_nothing_raised do
|
42
|
+
config = OpenStruct.new(@config_hash)
|
43
|
+
conn = HellaRedis::Connection.new(config)
|
44
|
+
end
|
45
|
+
assert_instance_of ::ConnectionPool, conn
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
class ConfigTests < UnitTests
|
51
|
+
desc "Config"
|
52
|
+
setup do
|
53
|
+
@config = Config.new(@config_hash)
|
54
|
+
end
|
55
|
+
subject{ @config }
|
56
|
+
|
57
|
+
should have_readers :url, :driver, :redis_ns, :timeout, :size
|
58
|
+
|
59
|
+
should "know its attributes" do
|
60
|
+
assert_equal @config_hash[:url], subject.url
|
61
|
+
assert_equal @config_hash[:driver], subject.driver
|
62
|
+
assert_equal @config_hash[:ns], subject.redis_ns
|
63
|
+
assert_equal @config_hash[:timeout], subject.timeout
|
64
|
+
assert_equal @config_hash[:size], subject.size
|
65
|
+
end
|
66
|
+
|
67
|
+
should "default its size" do
|
68
|
+
@config_hash.delete(:size)
|
69
|
+
config = Config.new(@config_hash)
|
70
|
+
assert_equal 1, config.size
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hella-redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kelly Redding
|
@@ -16,12 +16,10 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2014-12-30 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
name: assert
|
24
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
23
|
none: false
|
26
24
|
requirements:
|
27
25
|
- - ">="
|
@@ -30,42 +28,42 @@ dependencies:
|
|
30
28
|
segments:
|
31
29
|
- 0
|
32
30
|
version: "0"
|
33
|
-
|
31
|
+
version_requirements: *id001
|
32
|
+
type: :development
|
33
|
+
name: assert
|
34
34
|
prerelease: false
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
|
37
|
-
name: redis
|
38
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
37
|
none: false
|
40
38
|
requirements:
|
41
39
|
- - ~>
|
42
40
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
41
|
+
hash: 3
|
44
42
|
segments:
|
45
43
|
- 3
|
46
|
-
-
|
47
|
-
version: "3.
|
48
|
-
|
44
|
+
- 2
|
45
|
+
version: "3.2"
|
46
|
+
version_requirements: *id002
|
47
|
+
type: :runtime
|
48
|
+
name: redis
|
49
49
|
prerelease: false
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
|
-
|
52
|
-
name: redis-namespace
|
53
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
52
|
none: false
|
55
53
|
requirements:
|
56
54
|
- - ~>
|
57
55
|
- !ruby/object:Gem::Version
|
58
|
-
hash:
|
56
|
+
hash: 5
|
59
57
|
segments:
|
60
58
|
- 1
|
61
|
-
-
|
62
|
-
version: "1.
|
63
|
-
|
59
|
+
- 5
|
60
|
+
version: "1.5"
|
61
|
+
version_requirements: *id003
|
62
|
+
type: :runtime
|
63
|
+
name: redis-namespace
|
64
64
|
prerelease: false
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
|
-
|
67
|
-
name: connection_pool
|
68
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
67
|
none: false
|
70
68
|
requirements:
|
71
69
|
- - "="
|
@@ -76,7 +74,9 @@ dependencies:
|
|
76
74
|
- 9
|
77
75
|
- 2
|
78
76
|
version: 0.9.2
|
79
|
-
|
77
|
+
version_requirements: *id004
|
78
|
+
type: :runtime
|
79
|
+
name: connection_pool
|
80
80
|
prerelease: false
|
81
81
|
description: It's-a hella-redis!
|
82
82
|
email:
|
@@ -96,11 +96,14 @@ files:
|
|
96
96
|
- Rakefile
|
97
97
|
- hella-redis.gemspec
|
98
98
|
- lib/hella-redis.rb
|
99
|
-
- lib/hella-redis/
|
99
|
+
- lib/hella-redis/connection.rb
|
100
|
+
- lib/hella-redis/connection_spy.rb
|
100
101
|
- lib/hella-redis/version.rb
|
101
102
|
- log/.gitkeep
|
102
103
|
- test/helper.rb
|
103
|
-
- test/
|
104
|
+
- test/support/factory.rb
|
105
|
+
- test/unit/connection_spy_tests.rb
|
106
|
+
- test/unit/connection_tests.rb
|
104
107
|
- tmp/.gitkeep
|
105
108
|
homepage: http://github.com/redding/hella-redis
|
106
109
|
licenses: []
|
@@ -131,10 +134,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
134
|
requirements: []
|
132
135
|
|
133
136
|
rubyforge_project:
|
134
|
-
rubygems_version: 1.8.
|
137
|
+
rubygems_version: 1.8.29
|
135
138
|
signing_key:
|
136
139
|
specification_version: 3
|
137
140
|
summary: It's-a hella-redis!
|
138
141
|
test_files:
|
139
142
|
- test/helper.rb
|
140
|
-
- test/
|
143
|
+
- test/support/factory.rb
|
144
|
+
- test/unit/connection_spy_tests.rb
|
145
|
+
- test/unit/connection_tests.rb
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'redis'
|
2
|
-
require 'redis-namespace'
|
3
|
-
require 'connection_pool'
|
4
|
-
require 'hella-redis/version'
|
5
|
-
|
6
|
-
module HellaRedis::RedisConnection
|
7
|
-
|
8
|
-
def self.new(config)
|
9
|
-
@pool = ::ConnectionPool.new(:timeout => config.timeout, :size => config.size) do
|
10
|
-
::Redis::Namespace.new(config.redis_ns, {
|
11
|
-
:redis => ::Redis.connect({
|
12
|
-
:url => config.url,
|
13
|
-
:driver => config.driver
|
14
|
-
})
|
15
|
-
})
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'hella-redis/redis_connection'
|
3
|
-
require 'connection_pool'
|
4
|
-
require 'ostruct'
|
5
|
-
|
6
|
-
module HellaRedis::RedisConnection
|
7
|
-
|
8
|
-
class BaseTests < Assert::Context
|
9
|
-
desc "a RedisConnection"
|
10
|
-
setup do
|
11
|
-
@config = OpenStruct.new({
|
12
|
-
:timeout => 1,
|
13
|
-
:size => 5,
|
14
|
-
:redis_ns => 'hella-redis-test',
|
15
|
-
:driver => 'ruby',
|
16
|
-
:url => 'redis://localhost:6379/0'
|
17
|
-
})
|
18
|
-
@conn = HellaRedis::RedisConnection.new(@config)
|
19
|
-
end
|
20
|
-
subject{ @conn }
|
21
|
-
|
22
|
-
should "be a connection pool with the configured size and timeout" do
|
23
|
-
assert_kind_of ConnectionPool, subject
|
24
|
-
end
|
25
|
-
|
26
|
-
should "connect to the redis url" do
|
27
|
-
assert_nothing_raised do
|
28
|
-
subject.with do |conn|
|
29
|
-
assert_kind_of Redis::Namespace, conn
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|