em-redis-unified 0.6.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile +3 -0
- data/Rakefile +2 -33
- data/em-redis-unified.gemspec +27 -0
- data/lib/em-redis-unified.rb +1 -0
- data/lib/em-redis.rb +1 -3
- data/lib/em-redis/redis_protocol.rb +45 -10
- data/lib/em-redis/version.rb +4 -0
- data/spec/live_redis_pubsub_spec.rb +50 -0
- metadata +53 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54913b566f2a340684bd9a9406cec5ede44598cb
|
4
|
+
data.tar.gz: 04fd587693115490063b7dc5940a1574b097d840
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a19fa4b7fba1819cb23599f8a1ae1c68822b5541fd0c356100a4c7f93cb29c2a5cb6fc6efe1d46f85d6d92ce338d2180c166bc1eb497b5cdc3e58edf15a73796
|
7
|
+
data.tar.gz: c33a49fb6177bb3bef4a79388ae8e36311501694d5cebed1f9d5f1bbece87f37d1bba2df42333705a18da80f381f54caf51bfa6efdda91a7cd9c82076d48fc61
|
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,35 +1,6 @@
|
|
1
|
-
|
2
|
-
# configured in this Rakefile. The .rake files in the tasks directory
|
3
|
-
# are where the options are used.
|
1
|
+
require "bundler/gem_tasks"
|
4
2
|
|
5
|
-
|
6
|
-
require 'bones'
|
7
|
-
rescue LoadError
|
8
|
-
abort '### Please install the "bones" gem ###'
|
9
|
-
end
|
10
|
-
|
11
|
-
ensure_in_path 'lib'
|
12
|
-
require 'em-redis'
|
13
|
-
|
14
|
-
task :default => ['redis:test']
|
15
|
-
|
16
|
-
Bones {
|
17
|
-
name 'em-redis-unified'
|
18
|
-
authors ['Jonathan Broad', 'Eugene Pimenov', 'Sean Porter']
|
19
|
-
email 'portertech@gmail.com'
|
20
|
-
url 'http://github.com/portertech/em-redis'
|
21
|
-
summary 'An eventmachine-based implementation of the Redis protocol'
|
22
|
-
description summary
|
23
|
-
version EMRedis::VERSION
|
24
|
-
|
25
|
-
readme_file 'README.rdoc'
|
26
|
-
ignore_file '.gitignore'
|
27
|
-
|
28
|
-
depend_on 'eventmachine', '>=0.12.10'
|
29
|
-
|
30
|
-
depend_on "bacon", :development => true
|
31
|
-
depend_on "em-spec", :development => true
|
32
|
-
}
|
3
|
+
task :default => ["redis:test"]
|
33
4
|
|
34
5
|
namespace :redis do
|
35
6
|
desc "Test em-redis against a live Redis"
|
@@ -37,5 +8,3 @@ namespace :redis do
|
|
37
8
|
sh "bacon spec/live_redis_protocol_spec.rb spec/redis_commands_spec.rb spec/redis_protocol_spec.rb"
|
38
9
|
end
|
39
10
|
end
|
40
|
-
|
41
|
-
# EOF
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
3
|
+
require "em-redis/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "em-redis-unified"
|
7
|
+
spec.version = EMRedis::VERSION
|
8
|
+
spec.authors = ["Jonathan Broad", "Eugene Pimenov", "Sean Porter"]
|
9
|
+
spec.email = ["portertech@gmail.com"]
|
10
|
+
spec.summary = "An eventmachine-based implementation of the Redis protocol"
|
11
|
+
spec.description = "An eventmachine-based implementation of the Redis protocol"
|
12
|
+
spec.homepage = "https://github.com/portertech/em-redis"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency("eventmachine", ">= 0.12.10")
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "em-spec"
|
26
|
+
spec.add_development_dependency "bacon"
|
27
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "em-redis"
|
data/lib/em-redis.rb
CHANGED
@@ -7,11 +7,13 @@ module EventMachine
|
|
7
7
|
module Redis
|
8
8
|
include EM::Deferrable
|
9
9
|
|
10
|
+
attr_accessor :auto_reconnect, :reconnect_on_error
|
11
|
+
|
10
12
|
##
|
11
13
|
# constants
|
12
14
|
#########################
|
13
15
|
|
14
|
-
OK
|
16
|
+
OK = "OK".freeze
|
15
17
|
MINUS = "-".freeze
|
16
18
|
PLUS = "+".freeze
|
17
19
|
COLON = ":".freeze
|
@@ -191,6 +193,26 @@ module EventMachine
|
|
191
193
|
end
|
192
194
|
end
|
193
195
|
|
196
|
+
def subscribe(channel, proc=nil, &blk)
|
197
|
+
@subscribe_callbacks ||= Hash.new([])
|
198
|
+
@subscribe_callbacks[channel] += [(proc || blk)]
|
199
|
+
call_command(['subscribe', channel], &blk)
|
200
|
+
end
|
201
|
+
|
202
|
+
def unsubscribe(channel=nil, &blk)
|
203
|
+
@subscribe_callbacks ||= Hash.new([])
|
204
|
+
argv = ["unsubscribe"]
|
205
|
+
if channel
|
206
|
+
@subscribe_callbacks[channel] = [blk]
|
207
|
+
argv << channel
|
208
|
+
else
|
209
|
+
@subscribe_callbacks.each_key do |key|
|
210
|
+
@subscribe_callbacks[key] = [blk]
|
211
|
+
end
|
212
|
+
end
|
213
|
+
callback { send_command(argv) }
|
214
|
+
end
|
215
|
+
|
194
216
|
# Ruby defines a now deprecated type method so we need to override it here
|
195
217
|
# since it will never hit method_missing
|
196
218
|
def type(key, &blk)
|
@@ -356,7 +378,7 @@ module EventMachine
|
|
356
378
|
|
357
379
|
def auth_and_select_db
|
358
380
|
# auth and select go to the front of the line
|
359
|
-
callbacks = @callbacks
|
381
|
+
callbacks = @callbacks || []
|
360
382
|
@callbacks = []
|
361
383
|
call_command(["auth", @password]) if @password
|
362
384
|
call_command(["select", @db]) unless @db == 0
|
@@ -366,12 +388,12 @@ module EventMachine
|
|
366
388
|
|
367
389
|
def connection_completed
|
368
390
|
@logger.debug { "Connected to #{@host}:#{@port}" } if @logger
|
369
|
-
@reconnect_callbacks[:after].call if @reconnecting
|
370
391
|
@redis_callbacks = []
|
371
392
|
@multibulk_n = false
|
372
|
-
@reconnecting = false
|
373
393
|
@connected = true
|
374
394
|
auth_and_select_db
|
395
|
+
@reconnect_callbacks[:after].call if @reconnecting
|
396
|
+
@reconnecting = false
|
375
397
|
succeed
|
376
398
|
end
|
377
399
|
|
@@ -451,6 +473,15 @@ module EventMachine
|
|
451
473
|
end
|
452
474
|
end
|
453
475
|
|
476
|
+
if @subscribe_callbacks && value.is_a?(Array)
|
477
|
+
if %w[message unsubscribe].include?(value[0])
|
478
|
+
@subscribe_callbacks[value[1]].each do |blk|
|
479
|
+
blk.call(*value) if blk
|
480
|
+
end
|
481
|
+
return
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
454
485
|
callback = @redis_callbacks.shift
|
455
486
|
if callback.kind_of?(Array) && callback.length == 2
|
456
487
|
processor, blk = callback
|
@@ -478,6 +509,15 @@ module EventMachine
|
|
478
509
|
@connected || false
|
479
510
|
end
|
480
511
|
|
512
|
+
def reconnect!
|
513
|
+
@reconnect_callbacks[:before].call unless @reconnecting
|
514
|
+
@reconnecting = true
|
515
|
+
EM.add_timer(1) do
|
516
|
+
@logger.debug { "Reconnecting to #{@host}:#{@port}" } if @logger
|
517
|
+
reconnect(@host, @port)
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
481
521
|
def close
|
482
522
|
@closing = true
|
483
523
|
close_connection_after_writing
|
@@ -488,12 +528,7 @@ module EventMachine
|
|
488
528
|
if @closing
|
489
529
|
@reconnecting = false
|
490
530
|
elsif ((@connected || @reconnecting) && @auto_reconnect) || @reconnect_on_error
|
491
|
-
|
492
|
-
@reconnecting = true
|
493
|
-
EM.add_timer(1) do
|
494
|
-
@logger.debug { "Reconnecting to #{@host}:#{@port}" } if @logger
|
495
|
-
reconnect @host, @port
|
496
|
-
end
|
531
|
+
reconnect!
|
497
532
|
elsif @connected
|
498
533
|
error ConnectionError, 'connection closed'
|
499
534
|
else
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/test_helper.rb")
|
2
|
+
|
3
|
+
EM.describe EM::Protocols::Redis, "connected to an empty db" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@s = EM::Protocols::Redis.connect(:db => 14)
|
7
|
+
@p = EM::Protocols::Redis.connect(:db => 14)
|
8
|
+
end
|
9
|
+
|
10
|
+
should "be able to publish a message to a channel" do
|
11
|
+
@p.flushdb do
|
12
|
+
@p.publish("foo", "test") do |r|
|
13
|
+
r.should == 0
|
14
|
+
done
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
should "be able to subscribe to a channel and then unsubscribe" do
|
20
|
+
@s.flushdb do
|
21
|
+
@s.subscribe("foo", Proc.new {}) do |type, channel, subscribers|
|
22
|
+
type.should == "subscribe"
|
23
|
+
channel.should == "foo"
|
24
|
+
subscribers.should == 1
|
25
|
+
@s.unsubscribe do
|
26
|
+
done
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
should "be able to subscribe to a channel and publish a message to it" do
|
33
|
+
@s.flushdb do
|
34
|
+
callback = Proc.new do |type, channel, message|
|
35
|
+
type.should == "message"
|
36
|
+
channel.should == "foo"
|
37
|
+
message.should == "test"
|
38
|
+
done
|
39
|
+
end
|
40
|
+
@s.subscribe("foo", callback) do |type, channel, subscribers|
|
41
|
+
type.should == "subscribe"
|
42
|
+
channel.should == "foo"
|
43
|
+
subscribers.should == 1
|
44
|
+
@p.publish("foo", "test") do |r|
|
45
|
+
r.should == 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-redis-unified
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Broad
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-05-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: eventmachine
|
@@ -27,7 +27,35 @@ dependencies:
|
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: 0.12.10
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
30
|
+
name: bundler
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '1.6'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.6'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rake
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rspec
|
31
59
|
requirement: !ruby/object:Gem::Requirement
|
32
60
|
requirements:
|
33
61
|
- - ">="
|
@@ -55,44 +83,47 @@ dependencies:
|
|
55
83
|
- !ruby/object:Gem::Version
|
56
84
|
version: '0'
|
57
85
|
- !ruby/object:Gem::Dependency
|
58
|
-
name:
|
86
|
+
name: bacon
|
59
87
|
requirement: !ruby/object:Gem::Requirement
|
60
88
|
requirements:
|
61
89
|
- - ">="
|
62
90
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
91
|
+
version: '0'
|
64
92
|
type: :development
|
65
93
|
prerelease: false
|
66
94
|
version_requirements: !ruby/object:Gem::Requirement
|
67
95
|
requirements:
|
68
96
|
- - ">="
|
69
97
|
- !ruby/object:Gem::Version
|
70
|
-
version:
|
98
|
+
version: '0'
|
71
99
|
description: An eventmachine-based implementation of the Redis protocol
|
72
|
-
email:
|
100
|
+
email:
|
101
|
+
- portertech@gmail.com
|
73
102
|
executables: []
|
74
103
|
extensions: []
|
75
|
-
extra_rdoc_files:
|
76
|
-
- History.txt
|
77
|
-
- README.rdoc
|
104
|
+
extra_rdoc_files: []
|
78
105
|
files:
|
79
106
|
- ".gitignore"
|
107
|
+
- Gemfile
|
80
108
|
- History.txt
|
81
109
|
- README.rdoc
|
82
110
|
- Rakefile
|
111
|
+
- em-redis-unified.gemspec
|
112
|
+
- lib/em-redis-unified.rb
|
83
113
|
- lib/em-redis.rb
|
84
114
|
- lib/em-redis/redis_protocol.rb
|
115
|
+
- lib/em-redis/version.rb
|
85
116
|
- spec/live_redis_protocol_spec.rb
|
117
|
+
- spec/live_redis_pubsub_spec.rb
|
86
118
|
- spec/redis_commands_spec.rb
|
87
119
|
- spec/redis_protocol_spec.rb
|
88
120
|
- spec/test_helper.rb
|
89
|
-
homepage:
|
90
|
-
licenses:
|
121
|
+
homepage: https://github.com/portertech/em-redis
|
122
|
+
licenses:
|
123
|
+
- MIT
|
91
124
|
metadata: {}
|
92
125
|
post_install_message:
|
93
|
-
rdoc_options:
|
94
|
-
- "--main"
|
95
|
-
- README.rdoc
|
126
|
+
rdoc_options: []
|
96
127
|
require_paths:
|
97
128
|
- lib
|
98
129
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -106,9 +137,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
137
|
- !ruby/object:Gem::Version
|
107
138
|
version: '0'
|
108
139
|
requirements: []
|
109
|
-
rubyforge_project:
|
140
|
+
rubyforge_project:
|
110
141
|
rubygems_version: 2.2.2
|
111
142
|
signing_key:
|
112
143
|
specification_version: 4
|
113
144
|
summary: An eventmachine-based implementation of the Redis protocol
|
114
|
-
test_files:
|
145
|
+
test_files:
|
146
|
+
- spec/live_redis_protocol_spec.rb
|
147
|
+
- spec/live_redis_pubsub_spec.rb
|
148
|
+
- spec/redis_commands_spec.rb
|
149
|
+
- spec/redis_protocol_spec.rb
|
150
|
+
- spec/test_helper.rb
|