em-synchrony 0.3.0.beta.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/Gemfile +7 -5
- data/README.md +121 -91
- data/Rakefile +7 -1
- data/em-synchrony.gemspec +2 -2
- data/lib/em-synchrony.rb +29 -5
- data/lib/em-synchrony/active_record/connection_adapters/em_mysql2_adapter.rb +18 -0
- data/lib/em-synchrony/active_record/patches.rb +132 -0
- data/lib/em-synchrony/activerecord.rb +5 -0
- data/lib/em-synchrony/connection_pool.rb +3 -3
- data/lib/em-synchrony/em-hiredis.rb +24 -0
- data/lib/em-synchrony/em-http.rb +10 -6
- data/lib/em-synchrony/em-mongo.rb +80 -13
- data/lib/em-synchrony/em-redis.rb +29 -6
- data/lib/em-synchrony/em-remcached.rb +43 -19
- data/lib/em-synchrony/fiber_iterator.rb +18 -0
- data/lib/em-synchrony/keyboard.rb +33 -0
- data/lib/em-synchrony/mongo.rb +19 -1
- data/lib/em-synchrony/mysql2.rb +25 -0
- data/spec/activerecord_spec.rb +50 -0
- data/spec/em-mongo_spec.rb +192 -28
- data/spec/fiber_iterator_spec.rb +39 -0
- data/spec/helper/all.rb +2 -1
- data/spec/hiredis_spec.rb +40 -0
- data/spec/http_spec.rb +23 -0
- data/spec/keyboard_spec.rb +59 -0
- data/spec/{mysqlplus_spec.rb → mysql2_spec.rb} +26 -14
- data/spec/redis_spec.rb +39 -0
- data/spec/synchrony_spec.rb +14 -0
- data/spec/timer_spec.rb +35 -0
- metadata +52 -60
- data/examples/bitly.rb +0 -25
- data/lib/em-synchrony/em-bitly.rb +0 -58
- data/lib/em-synchrony/em-mysqlplus.rb +0 -27
@@ -1,20 +1,32 @@
|
|
1
1
|
require "spec/helper/all"
|
2
|
-
require "
|
3
|
-
require "em-mysqlplus"
|
2
|
+
require "em-synchrony/mysql2"
|
4
3
|
|
5
|
-
|
6
|
-
QUERY = "select sleep(#{DELAY})"
|
4
|
+
describe Mysql2::EM::Client do
|
7
5
|
|
8
|
-
|
6
|
+
DELAY = 0.25
|
7
|
+
QUERY = "SELECT sleep(#{DELAY}) as mysql2_query"
|
8
|
+
|
9
|
+
it "should support queries" do
|
10
|
+
res = []
|
11
|
+
EventMachine.synchrony do
|
12
|
+
db = Mysql2::EM::Client.new
|
13
|
+
res = db.query QUERY
|
14
|
+
|
15
|
+
EventMachine.stop
|
16
|
+
end
|
17
|
+
|
18
|
+
res.first.keys.should include("mysql2_query")
|
19
|
+
end
|
9
20
|
|
10
21
|
it "should fire sequential, synchronous requests" do
|
11
22
|
EventMachine.synchrony do
|
12
|
-
db =
|
23
|
+
db = Mysql2::EM::Client.new
|
24
|
+
|
13
25
|
start = now
|
14
26
|
res = []
|
15
27
|
|
16
|
-
res.push db.query
|
17
|
-
res.push db.query
|
28
|
+
res.push db.query QUERY
|
29
|
+
res.push db.query QUERY
|
18
30
|
(now - start.to_f).should be_within(DELAY * res.size * 0.15).of(DELAY * res.size)
|
19
31
|
|
20
32
|
EventMachine.stop
|
@@ -23,12 +35,12 @@ describe EventMachine::MySQL do
|
|
23
35
|
|
24
36
|
it "should have accept a callback, errback on async queries" do
|
25
37
|
EventMachine.synchrony do
|
26
|
-
db =
|
38
|
+
db = Mysql2::EM::Client.new
|
27
39
|
|
28
40
|
res = db.aquery(QUERY)
|
29
41
|
res.errback {|r| fail }
|
30
42
|
res.callback {|r|
|
31
|
-
r.
|
43
|
+
r.size.should == 1
|
32
44
|
EventMachine.stop
|
33
45
|
}
|
34
46
|
end
|
@@ -38,7 +50,7 @@ describe EventMachine::MySQL do
|
|
38
50
|
EventMachine.synchrony do
|
39
51
|
|
40
52
|
db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
|
41
|
-
|
53
|
+
Mysql2::EM::Client.new
|
42
54
|
end
|
43
55
|
|
44
56
|
start = now
|
@@ -59,7 +71,7 @@ describe EventMachine::MySQL do
|
|
59
71
|
it "should fire sequential and simultaneous MySQL requests" do
|
60
72
|
EventMachine.synchrony do
|
61
73
|
db = EventMachine::Synchrony::ConnectionPool.new(size: 3) do
|
62
|
-
|
74
|
+
Mysql2::EM::Client.new
|
63
75
|
end
|
64
76
|
|
65
77
|
start = now
|
@@ -87,10 +99,10 @@ describe EventMachine::MySQL do
|
|
87
99
|
|
88
100
|
it "should raise Mysql::Error in case of error" do
|
89
101
|
EventMachine.synchrony do
|
90
|
-
db =
|
102
|
+
db = Mysql2::EM::Client.new
|
91
103
|
proc {
|
92
104
|
db.query("SELECT * FROM i_hope_this_table_does_not_exist;")
|
93
|
-
}.should raise_error(
|
105
|
+
}.should raise_error(Mysql2::Error)
|
94
106
|
EventMachine.stop
|
95
107
|
end
|
96
108
|
end
|
data/spec/redis_spec.rb
CHANGED
@@ -23,6 +23,19 @@ describe EM::Protocols::Redis do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
it "should mapped_mget synchronously" do
|
27
|
+
EventMachine.synchrony do
|
28
|
+
redis = EM::Protocols::Redis.connect
|
29
|
+
|
30
|
+
redis.set('mmget1', 'value1')
|
31
|
+
redis.set('mmget3', 'value3')
|
32
|
+
redis.mapped_mget('mmget1', 'mmget2', 'mmget3').should ==
|
33
|
+
{ 'mmget1' => 'value1', 'mmget3' => 'value3' }
|
34
|
+
|
35
|
+
EM.stop
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
26
39
|
it "should incr/decr key synchronously" do
|
27
40
|
EventMachine.synchrony do
|
28
41
|
redis = EM::Protocols::Redis.connect
|
@@ -63,4 +76,30 @@ describe EM::Protocols::Redis do
|
|
63
76
|
end
|
64
77
|
end
|
65
78
|
end
|
79
|
+
|
80
|
+
it "should execute async mapped_mget" do
|
81
|
+
EventMachine.synchrony do
|
82
|
+
redis = EM::Protocols::Redis.connect
|
83
|
+
|
84
|
+
redis.aset('some_key', 'some_value') do
|
85
|
+
redis.amapped_mget('some_key', 'some_other_key') do |values|
|
86
|
+
values.should == { 'some_key' => 'some_value' }
|
87
|
+
EM.stop
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should execute sync add and auth" do
|
94
|
+
EventMachine.synchrony do
|
95
|
+
redis = EM::Protocols::Redis.connect
|
96
|
+
redis.auth('abc')
|
97
|
+
|
98
|
+
redis.delete('key')
|
99
|
+
redis.add('key', 'value')
|
100
|
+
redis.scard('key').should == 1
|
101
|
+
|
102
|
+
EM.stop
|
103
|
+
end
|
104
|
+
end
|
66
105
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "helper/all"
|
2
|
+
|
3
|
+
describe EM::Synchrony, "#sync" do
|
4
|
+
it "returns immediately if the syncee already succeeded" do
|
5
|
+
args = stub("args")
|
6
|
+
|
7
|
+
Fiber.new {
|
8
|
+
df = EM::DefaultDeferrable.new
|
9
|
+
df.succeed args
|
10
|
+
|
11
|
+
EM::Synchrony.sync(df).should == args
|
12
|
+
}.resume
|
13
|
+
end
|
14
|
+
end
|
data/spec/timer_spec.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require "spec/helper/all"
|
2
|
+
|
3
|
+
describe EventMachine::Synchrony do
|
4
|
+
|
5
|
+
it "should execute one-shot timer in Fiber" do
|
6
|
+
EM.synchrony do
|
7
|
+
start = Time.now.to_f
|
8
|
+
|
9
|
+
EM::Synchrony.add_timer(0.1) do
|
10
|
+
EM::Synchrony.sleep(0.1)
|
11
|
+
|
12
|
+
(Time.now.to_f - start).should > 0.2
|
13
|
+
EventMachine.stop
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should execute period timers in Fibers" do
|
19
|
+
EM.synchrony do
|
20
|
+
start = Time.now.to_f
|
21
|
+
num = 0
|
22
|
+
|
23
|
+
EM::Synchrony.add_periodic_timer(0.1) do
|
24
|
+
EM::Synchrony.sleep(0.1)
|
25
|
+
num += 1
|
26
|
+
|
27
|
+
if num > 1
|
28
|
+
(Time.now.to_f - start).should > 0.3
|
29
|
+
EventMachine.stop
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
metadata
CHANGED
@@ -1,58 +1,41 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-synchrony
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 3
|
8
|
-
- 0
|
9
|
-
- beta
|
10
|
-
- 1
|
11
|
-
version: 0.3.0.beta.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
12
6
|
platform: ruby
|
13
|
-
authors:
|
7
|
+
authors:
|
14
8
|
- Ilya Grigorik
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-08-27 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
23
15
|
name: eventmachine
|
24
|
-
requirement: &
|
16
|
+
requirement: &2154266640 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 0
|
32
|
-
- 0
|
33
|
-
- beta
|
34
|
-
- 1
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
35
21
|
version: 1.0.0.beta.1
|
36
22
|
type: :runtime
|
37
23
|
prerelease: false
|
38
|
-
version_requirements: *
|
24
|
+
version_requirements: *2154266640
|
39
25
|
description: Fiber aware EventMachine libraries
|
40
|
-
email:
|
26
|
+
email:
|
41
27
|
- ilya@igvita.com
|
42
28
|
executables: []
|
43
|
-
|
44
29
|
extensions: []
|
45
|
-
|
46
30
|
extra_rdoc_files: []
|
47
|
-
|
48
|
-
files:
|
31
|
+
files:
|
49
32
|
- .gitignore
|
33
|
+
- .rspec
|
50
34
|
- Gemfile
|
51
35
|
- README.md
|
52
36
|
- Rakefile
|
53
37
|
- em-synchrony.gemspec
|
54
38
|
- examples/all.rb
|
55
|
-
- examples/bitly.rb
|
56
39
|
- examples/go/README.md
|
57
40
|
- examples/go/channel.go
|
58
41
|
- examples/go/channel.rb
|
@@ -61,84 +44,93 @@ files:
|
|
61
44
|
- examples/go/go.rb
|
62
45
|
- examples/nethttp.rb
|
63
46
|
- lib/em-synchrony.rb
|
47
|
+
- lib/em-synchrony/active_record/connection_adapters/em_mysql2_adapter.rb
|
48
|
+
- lib/em-synchrony/active_record/patches.rb
|
49
|
+
- lib/em-synchrony/activerecord.rb
|
64
50
|
- lib/em-synchrony/connection_pool.rb
|
65
|
-
- lib/em-synchrony/em-
|
51
|
+
- lib/em-synchrony/em-hiredis.rb
|
66
52
|
- lib/em-synchrony/em-http.rb
|
67
53
|
- lib/em-synchrony/em-jack.rb
|
68
54
|
- lib/em-synchrony/em-memcache.rb
|
69
55
|
- lib/em-synchrony/em-mongo.rb
|
70
56
|
- lib/em-synchrony/em-multi.rb
|
71
|
-
- lib/em-synchrony/em-mysqlplus.rb
|
72
57
|
- lib/em-synchrony/em-redis.rb
|
73
58
|
- lib/em-synchrony/em-remcached.rb
|
59
|
+
- lib/em-synchrony/fiber_iterator.rb
|
74
60
|
- lib/em-synchrony/iterator.rb
|
61
|
+
- lib/em-synchrony/keyboard.rb
|
75
62
|
- lib/em-synchrony/mongo.rb
|
76
63
|
- lib/em-synchrony/mongoid.rb
|
64
|
+
- lib/em-synchrony/mysql2.rb
|
77
65
|
- lib/em-synchrony/tcpsocket.rb
|
78
66
|
- lib/em-synchrony/thread.rb
|
67
|
+
- spec/activerecord_spec.rb
|
79
68
|
- spec/beanstalk_spec.rb
|
80
69
|
- spec/connection_pool_spec.rb
|
81
70
|
- spec/em-mongo_spec.rb
|
71
|
+
- spec/fiber_iterator_spec.rb
|
82
72
|
- spec/helper/all.rb
|
83
73
|
- spec/helper/stub-http-server.rb
|
84
74
|
- spec/helper/tolerance_matcher.rb
|
75
|
+
- spec/hiredis_spec.rb
|
85
76
|
- spec/http_spec.rb
|
86
77
|
- spec/inlinesync_spec.rb
|
87
78
|
- spec/iterator_spec.rb
|
79
|
+
- spec/keyboard_spec.rb
|
88
80
|
- spec/memcache_spec.rb
|
89
81
|
- spec/mongo_spec.rb
|
90
|
-
- spec/
|
82
|
+
- spec/mysql2_spec.rb
|
91
83
|
- spec/redis_spec.rb
|
92
84
|
- spec/remcached_spec.rb
|
85
|
+
- spec/synchrony_spec.rb
|
93
86
|
- spec/tcpsocket_spec.rb
|
94
|
-
|
87
|
+
- spec/timer_spec.rb
|
95
88
|
homepage: http://github.com/igrigorik/em-synchrony
|
96
89
|
licenses: []
|
97
|
-
|
98
90
|
post_install_message:
|
99
91
|
rdoc_options: []
|
100
|
-
|
101
|
-
require_paths:
|
92
|
+
require_paths:
|
102
93
|
- lib
|
103
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
95
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
|
109
|
-
segments:
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
segments:
|
110
101
|
- 0
|
111
|
-
|
112
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
hash: 1015811308506799380
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
104
|
none: false
|
114
|
-
requirements:
|
115
|
-
- -
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
-
- 1
|
119
|
-
- 3
|
120
|
-
- 1
|
121
|
-
version: 1.3.1
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
122
109
|
requirements: []
|
123
|
-
|
124
110
|
rubyforge_project: em-synchrony
|
125
|
-
rubygems_version: 1.
|
111
|
+
rubygems_version: 1.8.5
|
126
112
|
signing_key:
|
127
113
|
specification_version: 3
|
128
114
|
summary: Fiber aware EventMachine libraries
|
129
|
-
test_files:
|
115
|
+
test_files:
|
116
|
+
- spec/activerecord_spec.rb
|
130
117
|
- spec/beanstalk_spec.rb
|
131
118
|
- spec/connection_pool_spec.rb
|
132
119
|
- spec/em-mongo_spec.rb
|
120
|
+
- spec/fiber_iterator_spec.rb
|
133
121
|
- spec/helper/all.rb
|
134
122
|
- spec/helper/stub-http-server.rb
|
135
123
|
- spec/helper/tolerance_matcher.rb
|
124
|
+
- spec/hiredis_spec.rb
|
136
125
|
- spec/http_spec.rb
|
137
126
|
- spec/inlinesync_spec.rb
|
138
127
|
- spec/iterator_spec.rb
|
128
|
+
- spec/keyboard_spec.rb
|
139
129
|
- spec/memcache_spec.rb
|
140
130
|
- spec/mongo_spec.rb
|
141
|
-
- spec/
|
131
|
+
- spec/mysql2_spec.rb
|
142
132
|
- spec/redis_spec.rb
|
143
133
|
- spec/remcached_spec.rb
|
134
|
+
- spec/synchrony_spec.rb
|
144
135
|
- spec/tcpsocket_spec.rb
|
136
|
+
- spec/timer_spec.rb
|
data/examples/bitly.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'lib/em-synchrony'
|
2
|
-
|
3
|
-
require "em-synchrony/em-bitly"
|
4
|
-
EM.synchrony do
|
5
|
-
bitly = Bitly.new('[INSERT_LOGIN]', '[INSERT_API_KEY]')
|
6
|
-
url = 'http://github.com/igrigorik/em-synchrony'
|
7
|
-
short = bitly.shorten(url)
|
8
|
-
|
9
|
-
p "Short #{url} => #{short.jmp_url}"
|
10
|
-
EM.stop
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
|
-
Bitly.use_api_version_3
|
15
|
-
EM.synchrony do
|
16
|
-
bitly = Bitly.new('[INSERT_LOGIN]', '[INSERT_API_KEY]')
|
17
|
-
|
18
|
-
url = 'http://github.com/igrigorik/em-synchrony'
|
19
|
-
domain='nyti.ms'
|
20
|
-
|
21
|
-
pro = bitly.bitly_pro_domain(domain)
|
22
|
-
p "Domain #{domain} pro=#{pro}"
|
23
|
-
|
24
|
-
EM.stop
|
25
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
begin
|
4
|
-
require "em-synchrony/em-http"
|
5
|
-
require "bitly"
|
6
|
-
rescue LoadError => error
|
7
|
-
raise "Missing EM-Synchrony dependencies: gem install em-http-request; gem install bitly -v=0.5.0"
|
8
|
-
end
|
9
|
-
|
10
|
-
module Bitly
|
11
|
-
module Utils
|
12
|
-
def get_result(request)
|
13
|
-
http = EventMachine::HttpRequest.new(request).get(:timeout => 100)
|
14
|
-
|
15
|
-
result = if (http.response_header.status == 200)
|
16
|
-
Crack::JSON.parse(http.response)
|
17
|
-
else
|
18
|
-
{'errorMessage' => 'JSON Parse Error(Bit.ly messed up)', 'errorCode' => 69, 'statusCode' => 'ERROR'}
|
19
|
-
end
|
20
|
-
|
21
|
-
if 'OK' == result['statusCode']
|
22
|
-
result['results']
|
23
|
-
else
|
24
|
-
raise BitlyError.new(result['errorMessage'],result['errorCode'])
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
module V3
|
30
|
-
class Client
|
31
|
-
class << self
|
32
|
-
def get(method, query)
|
33
|
-
query_values=[]
|
34
|
-
query[:query].each do |key, value|
|
35
|
-
query_values << "#{key}=#{CGI::escape(value.to_s)}"
|
36
|
-
end
|
37
|
-
query_values=query_values.join('&')
|
38
|
-
request=(method[0]=='/' ? "#{base_uri}#{method}" : method)
|
39
|
-
request=(request.include?('?') ? "#{request}&#{query_values}" : "#{request}?#{query_values}")
|
40
|
-
|
41
|
-
http = EventMachine::HttpRequest.new(request).get(:timeout => 100)
|
42
|
-
response = if (http.response_header.status == 200)
|
43
|
-
Crack::JSON.parse(http.response)
|
44
|
-
else
|
45
|
-
{'errorMessage' => 'JSON Parse Error(Bit.ly messed up)', 'errorCode' => 69, 'statusCode' => 'ERROR'}
|
46
|
-
end
|
47
|
-
|
48
|
-
if response['status_code'] == 200
|
49
|
-
return response
|
50
|
-
else
|
51
|
-
raise BitlyError.new(response['status_txt'], response['status_code'])
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|