redic 0.0.2 → 0.0.3
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/.gems +2 -0
- data/.gitignore +1 -0
- data/README.md +7 -7
- data/lib/redic.rb +8 -5
- data/lib/redic/client.rb +71 -0
- data/lib/redic/connection.rb +19 -0
- data/makefile +2 -0
- data/redic.gemspec +5 -4
- data/test/redic_test.rb +14 -4
- data/test/unix_test.rb +26 -0
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 826a4619b6aec694f3b74b8221db03a6e4cf8f61
|
4
|
+
data.tar.gz: 7c3635c0daf967b9567c9c9f92b8ad5b7ec09284
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53ee3848f37877d86f789e8883867b5f4d6daec0f6575df993e291b343829089471b986a529d09da358316c136b824209e47bebb23604d85da57ef26e99e53d4
|
7
|
+
data.tar.gz: df61e6d8c6551297490450d0001dc2b68691d0008321bfb296d34ed41048fce8f1f0e28163a13b619870c78d13651d8fe2971136e2ae850a5fe1ea85689bf0c2
|
data/.gems
ADDED
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/.gs
|
data/README.md
CHANGED
@@ -6,8 +6,8 @@ Lightweight Redis Client
|
|
6
6
|
Description
|
7
7
|
-----------
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
Lightweight Redis Client inspired by
|
10
|
+
[redigo](https://github.com/garyburd/redigo), a Redis client
|
11
11
|
library for golang.
|
12
12
|
|
13
13
|
## Usage
|
@@ -17,16 +17,16 @@ library for golang.
|
|
17
17
|
redis = Redic.new
|
18
18
|
|
19
19
|
# Processes the command and returns the response.
|
20
|
-
|
20
|
+
redis.call("SET", "foo", "bar")
|
21
21
|
|
22
|
-
assert_equal "bar",
|
22
|
+
assert_equal "bar", redis.call("GET", "foo")
|
23
23
|
|
24
24
|
# Pipelining is implemented by buffering commands,
|
25
25
|
# then calling Redic#run
|
26
|
-
|
27
|
-
|
26
|
+
redis.write("SET", "foo", "bar")
|
27
|
+
redis.write("GET", "foo")
|
28
28
|
|
29
|
-
assert_equal ["OK", "bar"],
|
29
|
+
assert_equal ["OK", "bar"], redis.run
|
30
30
|
```
|
31
31
|
|
32
32
|
## Installation
|
data/lib/redic.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
|
-
require "
|
1
|
+
require "redic/client"
|
2
2
|
|
3
3
|
class Redic
|
4
|
-
|
5
|
-
|
4
|
+
attr :url
|
5
|
+
|
6
|
+
def initialize(url = "redis://127.0.0.1:6379")
|
7
|
+
@url = url
|
8
|
+
@client = Redic::Client.new(url)
|
6
9
|
@buffer = []
|
7
10
|
end
|
8
11
|
|
9
12
|
def call(*args)
|
10
|
-
@client.
|
13
|
+
@client.connect do
|
11
14
|
@client.write(args)
|
12
15
|
@client.read
|
13
16
|
end
|
@@ -18,7 +21,7 @@ class Redic
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def run
|
21
|
-
@client.
|
24
|
+
@client.connect do
|
22
25
|
@buffer.each do |args|
|
23
26
|
@client.write(args)
|
24
27
|
end
|
data/lib/redic/client.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require "redic/connection"
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
class Redic
|
5
|
+
class Client
|
6
|
+
def initialize(url)
|
7
|
+
@uri = URI.parse(url)
|
8
|
+
@connection = nil
|
9
|
+
@semaphore = Mutex.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def read
|
13
|
+
@connection.read.tap do |reply|
|
14
|
+
raise reply if reply.kind_of?(RuntimeError)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def write(command)
|
19
|
+
@connection.write(command)
|
20
|
+
end
|
21
|
+
|
22
|
+
def connect
|
23
|
+
try(3) do
|
24
|
+
establish_connection unless connected?
|
25
|
+
|
26
|
+
@semaphore.synchronize do
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def try(times)
|
34
|
+
tries = 0
|
35
|
+
|
36
|
+
begin
|
37
|
+
yield
|
38
|
+
rescue Exception => err
|
39
|
+
if (tries += 1) <= times
|
40
|
+
sleep 0.01
|
41
|
+
retry
|
42
|
+
else
|
43
|
+
raise err, "%s (retries=%d)" % [err.message, tries]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def establish_connection
|
49
|
+
begin
|
50
|
+
@connection = Redic::Connection.new(@uri)
|
51
|
+
rescue Exception => err
|
52
|
+
raise err, "Can't connect to: %s" % @uri
|
53
|
+
end
|
54
|
+
|
55
|
+
authenticate
|
56
|
+
end
|
57
|
+
|
58
|
+
def authenticate
|
59
|
+
if @uri.password
|
60
|
+
@semaphore.synchronize do
|
61
|
+
write [:auth, @uri.password]
|
62
|
+
read
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def connected?
|
68
|
+
@connection && @connection.connected?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "hiredis/connection"
|
2
|
+
|
3
|
+
class Redic
|
4
|
+
module Connection
|
5
|
+
TIMEOUT = 10_000_000
|
6
|
+
|
7
|
+
def self.new(uri)
|
8
|
+
connection = Hiredis::Connection.new
|
9
|
+
|
10
|
+
if uri.scheme == "unix"
|
11
|
+
connection.connect_unix(uri.path, TIMEOUT)
|
12
|
+
else
|
13
|
+
connection.connect(uri.host, uri.port, TIMEOUT)
|
14
|
+
end
|
15
|
+
|
16
|
+
connection
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/makefile
ADDED
data/redic.gemspec
CHANGED
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "redic"
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.3"
|
6
6
|
s.summary = "Lightweight Redis Client"
|
7
|
-
s.description = "
|
7
|
+
s.description = "Lightweight Redis Client"
|
8
8
|
s.authors = ["Michel Martens", "Cyril David"]
|
9
|
-
s.email = ["michel@soveran.com", "
|
9
|
+
s.email = ["michel@soveran.com", "cyx@cyx.is"]
|
10
10
|
s.homepage = "https://github.com/amakawa/redic"
|
11
11
|
s.files = `git ls-files`.split("\n")
|
12
12
|
s.license = "MIT"
|
13
|
-
|
13
|
+
|
14
|
+
s.add_dependency "hiredis"
|
14
15
|
end
|
data/test/redic_test.rb
CHANGED
@@ -4,23 +4,33 @@ setup do
|
|
4
4
|
Redic.new
|
5
5
|
end
|
6
6
|
|
7
|
+
test "url" do |c|
|
8
|
+
assert_equal "redis://127.0.0.1:6379", c.url
|
9
|
+
end
|
10
|
+
|
7
11
|
test "normal commands" do |c|
|
8
|
-
c.call("SET", "foo", "bar")
|
12
|
+
c.call("SET", "foo", "bar")
|
9
13
|
|
10
14
|
assert_equal "bar", c.call("GET", "foo")
|
11
15
|
end
|
12
16
|
|
13
17
|
test "pipelining" do |c|
|
14
|
-
c.write("SET", "foo", "bar")
|
18
|
+
c.write("SET", "foo", "bar")
|
15
19
|
c.write("GET", "foo")
|
16
20
|
|
17
21
|
assert_equal ["OK", "bar"], c.run
|
18
22
|
end
|
19
23
|
|
20
24
|
test "multi/exec" do |c|
|
21
|
-
c.write("MULTI")
|
22
|
-
c.write("SET", "foo", "bar")
|
25
|
+
c.write("MULTI")
|
26
|
+
c.write("SET", "foo", "bar")
|
23
27
|
c.write("EXEC")
|
24
28
|
|
25
29
|
assert_equal ["OK", "QUEUED", ["OK"]], c.run
|
26
30
|
end
|
31
|
+
|
32
|
+
test "runtime errors" do |c|
|
33
|
+
assert_raise RuntimeError do
|
34
|
+
c.call("KABLAMMO")
|
35
|
+
end
|
36
|
+
end
|
data/test/unix_test.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path("../lib/redic", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
setup do
|
4
|
+
Redic.new("unix:///tmp/redis.sock")
|
5
|
+
end
|
6
|
+
|
7
|
+
test "normal commands" do |c|
|
8
|
+
c.call("SET", "foo", "bar")
|
9
|
+
|
10
|
+
assert_equal "bar", c.call("GET", "foo")
|
11
|
+
end
|
12
|
+
|
13
|
+
test "pipelining" do |c|
|
14
|
+
c.write("SET", "foo", "bar")
|
15
|
+
c.write("GET", "foo")
|
16
|
+
|
17
|
+
assert_equal ["OK", "bar"], c.run
|
18
|
+
end
|
19
|
+
|
20
|
+
test "multi/exec" do |c|
|
21
|
+
c.write("MULTI")
|
22
|
+
c.write("SET", "foo", "bar")
|
23
|
+
c.write("EXEC")
|
24
|
+
|
25
|
+
assert_equal ["OK", "QUEUED", ["OK"]], c.run
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
@@ -9,10 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: hiredis
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - '>='
|
@@ -25,19 +25,25 @@ dependencies:
|
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
|
-
description:
|
28
|
+
description: Lightweight Redis Client
|
29
29
|
email:
|
30
30
|
- michel@soveran.com
|
31
|
-
-
|
31
|
+
- cyx@cyx.is
|
32
32
|
executables: []
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
+
- .gems
|
37
|
+
- .gitignore
|
36
38
|
- LICENSE
|
37
39
|
- README.md
|
38
40
|
- lib/redic.rb
|
41
|
+
- lib/redic/client.rb
|
42
|
+
- lib/redic/connection.rb
|
43
|
+
- makefile
|
39
44
|
- redic.gemspec
|
40
45
|
- test/redic_test.rb
|
46
|
+
- test/unix_test.rb
|
41
47
|
homepage: https://github.com/amakawa/redic
|
42
48
|
licenses:
|
43
49
|
- MIT
|