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.
@@ -1,20 +1,32 @@
1
1
  require "spec/helper/all"
2
- require "mysqlplus"
3
- require "em-mysqlplus"
2
+ require "em-synchrony/mysql2"
4
3
 
5
- DELAY = 0.25
6
- QUERY = "select sleep(#{DELAY})"
4
+ describe Mysql2::EM::Client do
7
5
 
8
- describe EventMachine::MySQL do
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 = EventMachine::MySQL.new(host: "localhost")
23
+ db = Mysql2::EM::Client.new
24
+
13
25
  start = now
14
26
  res = []
15
27
 
16
- res.push db.query(QUERY)
17
- res.push db.query(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 = EventMachine::MySQL.new(host: "localhost")
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.all_hashes.size.should == 1
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
- EventMachine::MySQL.new(host: "localhost")
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
- EventMachine::MySQL.new(host: "localhost")
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 = EventMachine::MySQL.new(host: "localhost")
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(Mysql::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
@@ -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
- prerelease: true
5
- segments:
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
- date: 2011-02-23 00:00:00 -05:00
20
- default_executable:
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: &id001 !ruby/object:Gem::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: *id001
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-bitly.rb
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/mysqlplus_spec.rb
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
- has_rdoc: true
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
- hash: -1057112667937056146
109
- segments:
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ segments:
110
101
  - 0
111
- version: "0"
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
- segments:
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.3.7
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/mysqlplus_spec.rb
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