em-synchrony 0.3.0.beta.1 → 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.
- 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
|