em-redis-unified 0.6.0 → 1.0.0
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 +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
|