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.
@@ -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