em-synchrony 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9fce19d87bacaaddaf2d367cf360ddc1b84c7b1
4
- data.tar.gz: 61be19297e6ee682210f7275ef29085060ade75f
3
+ metadata.gz: da875d80b703df6b9a5edcb8af8a005347e53a4a
4
+ data.tar.gz: 978abcb2c127704ef62362e97aac92fe71804f1c
5
5
  SHA512:
6
- metadata.gz: f963c206f3d8e4fe10bb4c1b67494915b65ae1a2b8a4c2551e51e8ee651c3dae2edc188452de23e92646990c7b1dee45232e8688014592ba7fa162a1b431a236
7
- data.tar.gz: b2aac7705b2c345c1f9607443567c10f18edc190a0070193713d89b69e5d5f31f07d3746da0c6091c03472841431064bc7062be955f0d9040e93ff1769235b6b
6
+ metadata.gz: b5b91b1d7b354a8ada8805d96eb16ff9ca5e66d1d0c76d259b27d0f1fc051fecb02c22856e7a5fbfa58fe04223923d2380db5ea543ebe253d4f59d1460fa9789
7
+ data.tar.gz: 62c7e7ffa573dd30654b92f0642a61905e2b071d8e5f312eaf0b52321754fcacfd9b59ef669b5fecfb56b16f43165c12b81d684c0d2b32a13c0d05242f42ccfd
@@ -0,0 +1,28 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+
6
+ sudo: false
7
+
8
+ services:
9
+ - mysql
10
+ - rabbitmq
11
+ - mongodb
12
+ - memcached
13
+ - redis-server
14
+
15
+ before_script:
16
+ - mysql < spec/widgets.sql
17
+
18
+ matrix:
19
+ include:
20
+ - env: "activerecord=3.2.21"
21
+ script: "bundle exec rspec spec/activerecord_spec.rb"
22
+ - env: "activerecord=4.0.9"
23
+ script: "bundle exec rspec spec/activerecord_spec.rb"
24
+ - env: "activerecord=4.2.0"
25
+ script: "bundle exec rspec spec/activerecord_spec.rb"
26
+ allow_failures:
27
+ - env: "activerecord=3.2.21"
28
+ - env: "activerecord=4.2.0"
data/Gemfile CHANGED
@@ -1,19 +1,19 @@
1
- source :gemcutter
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'eventmachine', :git => 'git://github.com/eventmachine/eventmachine.git'
4
4
 
5
5
  group :development do
6
6
  gem 'rake'
7
- gem 'rspec'
7
+ gem 'rspec', '~> 3.2'
8
8
  gem 'em-http-request', :git => 'git://github.com/igrigorik/em-http-request'
9
9
  gem 'remcached'
10
10
  # gem 'em-mongo', :git => 'https://github.com/bcg/em-mongo.git'
11
- gem 'activerecord', '>= 3.1.0.rc6'
11
+ gem 'activerecord', "= #{ENV['activerecord'] || '4.1.8'}"
12
12
  gem 'em-mongo'
13
13
  gem 'bson_ext'
14
- gem 'mysql2'
14
+ gem 'mysql2', '~> 0.3.18'
15
15
  gem 'em-redis', '~> 0.3.0'
16
16
  gem 'em-hiredis'
17
17
  gem 'mongo'
18
- gem 'amqp'
18
+ gem 'amqp', '= 1.0.0'
19
19
  end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Ilya Grigorik
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included
12
+ in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/em-synchrony.png)](http://rubygems.org/gems/em-synchrony)
4
4
  [![Analytics](https://ga-beacon.appspot.com/UA-71196-10/em-synchrony/readme)](https://github.com/igrigorik/ga-beacon)
5
+ [![Build Status](https://travis-ci.org/igrigorik/em-synchrony.svg?branch=master)](https://travis-ci.org/igrigorik/em-synchrony)
5
6
 
6
7
  Collection of convenience classes and primitives to help untangle evented code, plus a number of patched EM clients to make them Fiber aware. To learn more, please see: [Untangling Evented Code with Ruby Fibers](http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers).
7
8
 
@@ -172,6 +173,31 @@ ActiveRecord::Base.establish_connection(
172
173
  result = Widget.all.to_a
173
174
  ```
174
175
 
176
+ ## Hooks
177
+
178
+ em-synchrony already provides fiber-aware calls for sleep, system and defer. When mixing fiber-aware code with other gems, these might use non-fiber-aware versions which result in unexpected behavior: calling `sleep` would pause the whole reactor instead of
179
+ a single fiber. For that reason, hooks into the Kernel are provided to override the default behavior to e.g. add logging or redirect these calls their fiber-aware versions.
180
+
181
+ ```ruby
182
+ # Adding logging but still executes the actual sleep
183
+ require "em-synchrony"
184
+ log = Logger.new(STDOUT)
185
+ EM::Synchrony.on_sleep do |*args|
186
+ log.warn "Kernel.sleep called by:"
187
+ caller.each { |line| log.warn line }
188
+ sleep(*args) # Calls the actual sleep
189
+ end
190
+ ```
191
+
192
+ ```ruby
193
+ # Redirects to EM::Synchrony.sleep
194
+ require "em-synchrony"
195
+ log = Logger.new(STDOUT)
196
+ EM::Synchrony.on_sleep do |*args|
197
+ EM::Synchrony.sleep(*args)
198
+ end
199
+ ```
200
+
175
201
  # License
176
202
 
177
203
  The MIT License - Copyright (c) 2011 Ilya Grigorik
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "em-synchrony"
6
- s.version = "1.0.4"
6
+ s.version = "1.0.5"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Ilya Grigorik"]
9
9
  s.email = ["ilya@igvita.com"]
@@ -12,8 +12,6 @@ Gem::Specification.new do |s|
12
12
  s.summary = %q{Fiber aware EventMachine libraries}
13
13
  s.description = s.summary
14
14
 
15
- s.rubyforge_project = "em-synchrony"
16
-
17
15
  s.add_runtime_dependency("eventmachine", ">= 1.0.0.beta.1")
18
16
 
19
17
  s.files = `git ls-files`.split("\n")
@@ -41,7 +41,12 @@ module ActiveRecord
41
41
  include EM::Synchrony::ActiveRecord::Client
42
42
  end
43
43
 
44
- include EM::Synchrony::ActiveRecord::Adapter
44
+ if ::ActiveRecord.version >= Gem::Version.new('4.2')
45
+ require 'em-synchrony/activerecord_4_2'
46
+ include EM::Synchrony::ActiveRecord::Adapter_4_2
47
+ else
48
+ include EM::Synchrony::ActiveRecord::Adapter
49
+ end
45
50
  end
46
51
  end
47
52
  end
@@ -15,6 +15,7 @@ require "em-synchrony/tcpsocket"
15
15
  require "em-synchrony/connection_pool"
16
16
  require "em-synchrony/keyboard"
17
17
  require "em-synchrony/iterator" if EventMachine::VERSION > '0.12.10'
18
+ require "em-synchrony/kernel"
18
19
 
19
20
  module EventMachine
20
21
 
@@ -130,6 +131,15 @@ module EventMachine
130
131
  Fiber.yield
131
132
  end
132
133
 
134
+ # Overrides behavior of kernel.sleep
135
+ # Allows to add custom behavior, e.g. logging or redirection to
136
+ # EM::Synchrony.sleep .
137
+ # Calling 'sleep' in this function calls the actual kernel method.
138
+ #
139
+ def self.on_sleep(&blk)
140
+ Kernel.em_synchrony_sleep_hook = blk
141
+ end
142
+
133
143
  # Routes to EM::Synchrony::Keyboard
134
144
  #
135
145
  def self.gets
@@ -145,3 +155,6 @@ module EventMachine
145
155
  end
146
156
  end
147
157
  end
158
+
159
+ # Alias for {EventMachine::Synchrony}
160
+ EM::S = EventMachine::Synchrony
@@ -0,0 +1,61 @@
1
+ require 'active_record'
2
+
3
+ module EM::Synchrony
4
+ module ActiveRecord
5
+ module Adapter_4_2
6
+ def configure_connection
7
+ nil
8
+ end
9
+
10
+ def transaction(*args)
11
+ @connection.execute(false) do |conn|
12
+ super
13
+ end
14
+ end
15
+
16
+ def reset_transaction #:nodoc:
17
+ @transaction_manager = TransactionManager.new(self)
18
+ end
19
+ end
20
+
21
+ class TransactionManager < ::ActiveRecord::ConnectionAdapters::TransactionManager
22
+ def initialize(*args)
23
+ super
24
+ @stack = Hash.new { |h, k| h[k] = [] }
25
+ end
26
+
27
+ def current_transaction #:nodoc:
28
+ _current_stack.last || NULL_TRANSACTION
29
+ end
30
+
31
+ def open_transactions
32
+ _current_stack.size
33
+ end
34
+
35
+ def begin_transaction(options = {}) #:nodoc:
36
+ transaction =
37
+ if _current_stack.empty?
38
+ ::ActiveRecord::ConnectionAdapters::RealTransaction.new(@connection, options)
39
+ else
40
+ ::ActiveRecord::ConnectionAdapters::SavepointTransaction.new(@connection, "active_record_#{Fiber.current.object_id}_#{open_transactions}", options)
41
+ end
42
+ _current_stack.push(transaction)
43
+ transaction
44
+ end
45
+
46
+ def commit_transaction #:nodoc:
47
+ _current_stack.pop.commit
48
+ end
49
+
50
+ def rollback_transaction #:nodoc:
51
+ _current_stack.pop.rollback
52
+ end
53
+
54
+ private
55
+
56
+ def _current_stack
57
+ @stack[Fiber.current.object_id]
58
+ end
59
+ end
60
+ end
61
+ end
@@ -13,11 +13,11 @@ module EventMachine
13
13
  def add(name, conn)
14
14
  raise 'Duplicate Multi key' if @requests.key? name
15
15
 
16
+ @requests[name] = conn
17
+
16
18
  fiber = Fiber.current
17
19
  conn.callback { @responses[:callback][name] = conn; check_progress(fiber) }
18
20
  conn.errback { @responses[:errback][name] = conn; check_progress(fiber) }
19
-
20
- @requests[name] = conn
21
21
  end
22
22
 
23
23
  def finished?
@@ -7,7 +7,7 @@ module EventMachine
7
7
  # and auto-advance the iterator after each call
8
8
  def each(foreach=nil, after=nil, &blk)
9
9
  fe = Proc.new do |obj, iter|
10
- Fiber.new { (foreach || blk).call(obj); iter.next }.resume
10
+ Fiber.new { (foreach || blk).call(obj, iter); iter.next }.resume
11
11
  end
12
12
 
13
13
  super(fe, after)
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ require 'em-synchrony'
3
+
4
+ # Monkey-patch
5
+ module Kernel
6
+ alias_method :orig_sleep, :sleep
7
+
8
+ class << self
9
+ attr_accessor :em_synchrony_sleep_hook
10
+ end
11
+
12
+ # Monkey-patch
13
+ def sleep(sleep_time)
14
+ if Kernel.em_synchrony_sleep_hook &&
15
+ EM.reactor_thread? &&
16
+ !Thread.current[:em_synchrony_sleep_hook_called]
17
+ begin
18
+ Thread.current[:em_synchrony_sleep_hook_called] = true
19
+ Kernel.em_synchrony_sleep_hook.call(sleep_time)
20
+ ensure
21
+ Thread.current[:em_synchrony_sleep_hook_called] = false
22
+ end
23
+ else
24
+ orig_sleep(sleep_time)
25
+ end
26
+ end
27
+ end
@@ -2,28 +2,31 @@ require "spec/helper/all"
2
2
  require "em-synchrony/activerecord"
3
3
  require "em-synchrony/fiber_iterator"
4
4
 
5
- # create database widgets;
6
- # use widgets;
7
- # create table widgets (
8
- # id INT NOT NULL AUTO_INCREMENT,
9
- # title varchar(255),
10
- # PRIMARY KEY (`id`)
11
- # );
5
+ # mysql < spec/widgets.sql
12
6
 
13
7
  class Widget < ActiveRecord::Base; end;
14
8
 
15
9
  describe "Fiberized ActiveRecord driver for mysql2" do
16
10
  DELAY = 0.25
17
11
  QUERY = "SELECT sleep(#{DELAY})"
12
+ LOGGER = Logger.new(STDOUT).tap do |logger|
13
+ logger.formatter = proc do |_severity, datetime, _progname, msg|
14
+ "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')} ##{Fiber.current.object_id}] -- : #{msg}\n"
15
+ end
16
+ end
17
+
18
+ before(:all) do
19
+ ActiveRecord::Base.logger = LOGGER if ENV['LOGGER']
20
+ end
18
21
 
19
22
  def establish_connection
20
- ActiveRecord::Base.establish_connection(
21
- :adapter => 'em_mysql2',
22
- :database => 'widgets',
23
- :username => 'root',
24
- :pool => 10
25
- )
26
- Widget.delete_all
23
+ ActiveRecord::Base.establish_connection(
24
+ :adapter => 'em_mysql2',
25
+ :database => 'widgets',
26
+ :username => 'root',
27
+ :pool => 10
28
+ )
29
+ Widget.delete_all
27
30
  end
28
31
 
29
32
  it "should establish AR connection" do
@@ -95,6 +98,7 @@ describe "Fiberized ActiveRecord driver for mysql2" do
95
98
  widget.update_attributes title: "hello"
96
99
  end
97
100
  ActiveRecord::Base.transaction do
101
+ widget.update_attributes(title: 'hey')
98
102
  raise ActiveRecord::Rollback
99
103
  end
100
104
  end
@@ -106,4 +110,4 @@ describe "Fiberized ActiveRecord driver for mysql2" do
106
110
  end
107
111
  end
108
112
 
109
- end
113
+ end
@@ -5,7 +5,7 @@ describe EM::Synchrony::AMQP do
5
5
  it "should yield until connection is ready" do
6
6
  EM.synchrony do
7
7
  connection = EM::Synchrony::AMQP.connect
8
- connection.connected?.should be_true
8
+ connection.connected?.should eq(true)
9
9
  EM.stop
10
10
  end
11
11
  end
@@ -14,7 +14,7 @@ describe EM::Synchrony::AMQP do
14
14
  EM.synchrony do
15
15
  connection = EM::Synchrony::AMQP.connect
16
16
  connection.disconnect
17
- connection.connected?.should be_false
17
+ connection.connected?.should eq(false)
18
18
  EM.stop
19
19
  end
20
20
  end
@@ -30,7 +30,7 @@ describe EventMachine::Synchrony do
30
30
  3
31
31
  end
32
32
 
33
- EM::Synchrony.defer(op).should == 3
33
+ EM::S.defer(op).should == 3
34
34
  x.should == 2
35
35
 
36
36
  EM.stop
@@ -4,10 +4,10 @@ describe EM::Mongo do
4
4
  it "should yield until connection is ready" do
5
5
  EventMachine.synchrony do
6
6
  connection = EM::Mongo::Connection.new
7
- connection.connected?.should be_true
7
+ connection.connected?.should eq(true)
8
8
 
9
9
  db = connection.db('db')
10
- db.is_a?(EventMachine::Mongo::Database).should be_true
10
+ db.is_a?(EventMachine::Mongo::Database).should eq(true)
11
11
 
12
12
  EventMachine.stop
13
13
  end
@@ -45,7 +45,7 @@ describe EM::Mongo do
45
45
  obj2.size.should == 1
46
46
 
47
47
  obj3 = collection.first
48
- obj3.is_a?(Hash).should be_true
48
+ obj3.is_a?(Hash).should eq(true)
49
49
 
50
50
  EventMachine.stop
51
51
  end
@@ -114,7 +114,7 @@ describe EM::Mongo do
114
114
  obj2.size.should == 1
115
115
  end
116
116
  collection.afirst.callback do |obj3|
117
- obj3.is_a?(Hash).should be_true
117
+ obj3.is_a?(Hash).should eq(true)
118
118
  obj3['hello'].should == 'world'
119
119
  EM.next_tick{ EventMachine.stop }
120
120
  end
@@ -181,7 +181,7 @@ describe EM::Mongo do
181
181
  obj2.size.should == 1
182
182
  end
183
183
  collection.afirst do |obj3|
184
- obj3.is_a?(Hash).should be_true
184
+ obj3.is_a?(Hash).should eq(true)
185
185
  obj3['hello'].should == 'world'
186
186
  EM.next_tick{ EventMachine.stop }
187
187
  end
@@ -233,7 +233,7 @@ describe EM::Mongo do
233
233
 
234
234
  context "authentication" do
235
235
  # these specs only get asserted if you run mongod with the --auth flag
236
- it "successfully authenticates" do
236
+ it "successfully authenticates", ci_skip: true do
237
237
  # For this spec you will need to add this user to the database
238
238
  #
239
239
  # From the Mongo shell:
@@ -18,6 +18,19 @@ describe EventMachine::Synchrony::FiberIterator do
18
18
  end
19
19
  end
20
20
 
21
+ it "works even with nested arrays and iterator" do
22
+ EM.synchrony do
23
+ results = []
24
+ list = [[1, 2], [3, 4]]
25
+
26
+ EM::Synchrony::FiberIterator.new(list, 2).each { |sublist, iter| results.push(sublist) }
27
+
28
+ expect(results).to eq(list)
29
+
30
+ EM.stop
31
+ end
32
+ end
33
+
21
34
  #
22
35
  # it "should sum values within the iterator" do
23
36
  # EM.synchrony do
@@ -14,4 +14,6 @@ def now(); Time.now.to_f; end
14
14
 
15
15
  RSpec.configure do |config|
16
16
  config.include(Sander6::CustomMatchers)
17
+
18
+ config.filter_run_excluding ci_skip: true if ENV['CI']
17
19
  end
@@ -2,10 +2,13 @@ require "spec/helper/all"
2
2
 
3
3
  describe EM::Hiredis do
4
4
 
5
- it "should yield until connection is ready" do
5
+ it "should connect on demand" do
6
6
  EventMachine.synchrony do
7
7
  connection = EM::Hiredis::Client.connect
8
- connection.connected.should be_true
8
+ connection.should_not be_connected
9
+
10
+ connection.ping
11
+ connection.should be_connected
9
12
 
10
13
  EventMachine.stop
11
14
  end
@@ -0,0 +1,78 @@
1
+ # encoding: UTF-8
2
+ require 'spec/helper/all'
3
+
4
+ describe EventMachine::Synchrony do
5
+ before do
6
+ EM::Synchrony.on_sleep
7
+ end
8
+ after do
9
+ EM::Synchrony.on_sleep
10
+ end
11
+ describe '#sleep' do
12
+ context 'outside synchrony' do
13
+ it 'does not call hook' do
14
+ EM::Synchrony.on_sleep { fail 'should not happen' }
15
+ expect { sleep(0.01) }.not_to raise_error
16
+ end
17
+ context 'with synchrony in another thread'do
18
+ before do
19
+ @thread = Thread.new do
20
+ EM.run do
21
+ sleep(0.5)
22
+ EM.stop
23
+ end
24
+ end
25
+ sleep(0.1)
26
+ end
27
+ after do
28
+ @thread.join
29
+ end
30
+ it 'does not call hook' do
31
+ EM::Synchrony.on_sleep { fail 'should not happen' }
32
+ expect { sleep(0.01) }.not_to raise_error
33
+ end
34
+ end
35
+ end
36
+
37
+ context 'within synchrony' do
38
+ around do |example|
39
+ EM.synchrony do
40
+ example.run
41
+ EM.next_tick { EM.stop }
42
+ end
43
+ end
44
+ context 'with no hook defined' do
45
+ it 'calls Kernel.sleep' do
46
+ expect(self).to receive(:sleep)
47
+ sleep(1)
48
+ end
49
+ end
50
+ context 'with hook defined' do
51
+ it 'executes the hook' do
52
+ called = 0
53
+ EM::Synchrony.on_sleep { called += 1 }
54
+ (1..10).each do |count|
55
+ sleep(1)
56
+ expect(called).to be count
57
+ end
58
+ end
59
+ it 'propagates exceptions' do
60
+ msg = 'expected exception'
61
+ EM::Synchrony.on_sleep { fail msg }
62
+ expect { sleep(1) }.to raise_error(RuntimeError, msg)
63
+ end
64
+ context "when calling 'sleep' in the hook" do
65
+ it 'calls the original sleep' do
66
+ sleep_time = 1.213234123412341454134512345
67
+ expect(self).to receive(:orig_sleep).with(sleep_time)
68
+ EM::Synchrony.on_sleep do |*args|
69
+ sleep(*args)
70
+ end
71
+ sleep(sleep_time)
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -9,5 +9,21 @@ describe EM::Synchrony do
9
9
  m.add :df1, EM::DefaultDeferrable.new
10
10
  end.should raise_error("Duplicate Multi key")
11
11
  end
12
+
13
+ context "when defferable succeeded before adding" do
14
+ it "does not succeed twice" do
15
+ multi = EM::Synchrony::Multi.new
16
+ multi.should_receive(:succeed).once
17
+
18
+ slow = EM::DefaultDeferrable.new
19
+ multi.add :slow, slow
20
+
21
+ quick = EM::DefaultDeferrable.new
22
+ quick.succeed
23
+ multi.add :quick, quick
24
+
25
+ slow.succeed
26
+ end
27
+ end
12
28
  end
13
- end
29
+ end
@@ -5,7 +5,7 @@ describe EM::Protocols::Redis do
5
5
  it "should yield until connection is ready" do
6
6
  EventMachine.synchrony do
7
7
  connection = EM::Protocols::Redis.connect
8
- connection.connected.should be_true
8
+ connection.connected.should eq(true)
9
9
 
10
10
  EventMachine.stop
11
11
  end
@@ -90,7 +90,7 @@ describe EM::Protocols::Redis do
90
90
  end
91
91
  end
92
92
 
93
- it "should execute sync add and auth" do
93
+ it "should execute sync add and auth", ci_skip: true do
94
94
  EventMachine.synchrony do
95
95
  redis = EM::Protocols::Redis.connect
96
96
  redis.auth('abc')
@@ -102,4 +102,4 @@ describe EM::Protocols::Redis do
102
102
  EM.stop
103
103
  end
104
104
  end
105
- end
105
+ end
@@ -6,7 +6,7 @@ describe Memcached do
6
6
  it "should yield until connection is ready" do
7
7
  EventMachine.synchrony do
8
8
  Memcached.connect %w(localhost)
9
- Memcached.usable?.should be_true
9
+ Memcached.usable?.should eq(true)
10
10
  EventMachine.stop
11
11
  end
12
12
  end
@@ -28,9 +28,9 @@ describe Memcached do
28
28
  end
29
29
 
30
30
  it "should fire multi memcached requests" do
31
- EventMachine.synchrony do
32
- pending "patch mult-get"
31
+ skip "patch mult-get"
33
32
 
33
+ EventMachine.synchrony do
34
34
  Memcached.connect %w(localhost)
35
35
  Memcached.multi_get([{:key => 'foo'},{:key => 'bar'}, {:key => 'test'}]) do |res|
36
36
  # TODO
@@ -19,14 +19,23 @@ describe EM::Synchrony do
19
19
 
20
20
  describe "#next_tick" do
21
21
  it "should wrap next_tick into a Fiber context" do
22
- Fiber.new {
23
- df = EM::DefaultDeferrable.new
22
+ EM.synchrony {
23
+ begin
24
+ fired = false
25
+ f = Fiber.current
26
+
27
+ EM::Synchrony.next_tick do
28
+ fired = true
29
+ Fiber.current.should_not eq(f)
30
+ end
24
31
 
25
- EM::Synchrony.next_tick do
26
- df.succeed args
27
- EM::Synchrony.sync(df).should == args
32
+ EM::Synchrony.interrupt
33
+
34
+ fired.should eq(true)
35
+ ensure
36
+ EM.stop
28
37
  end
29
- }.resume
38
+ }
30
39
  end
31
40
  end
32
41
 
@@ -5,13 +5,11 @@ describe EventMachine::Synchrony do
5
5
  it "system: simple" do
6
6
  EM.synchrony do
7
7
  out, status = EM::Synchrony.system("echo 'some'")
8
-
8
+
9
9
  status.should == 0
10
10
  out.should == "some\n"
11
-
12
- EM.stop
11
+
12
+ EM.stop
13
13
  end
14
14
  end
15
-
16
-
17
15
  end
@@ -0,0 +1,9 @@
1
+ create database widgets;
2
+
3
+ use widgets;
4
+
5
+ create table widgets (
6
+ id INT NOT NULL AUTO_INCREMENT,
7
+ title varchar(255),
8
+ PRIMARY KEY (`id`)
9
+ );
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-synchrony
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Grigorik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-18 00:00:00.000000000 Z
11
+ date: 2016-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -33,7 +33,9 @@ extra_rdoc_files: []
33
33
  files:
34
34
  - ".gitignore"
35
35
  - ".rspec"
36
+ - ".travis.yml"
36
37
  - Gemfile
38
+ - LICENSE
37
39
  - README.md
38
40
  - Rakefile
39
41
  - em-synchrony.gemspec
@@ -48,6 +50,7 @@ files:
48
50
  - lib/active_record/connection_adapters/em_mysql2_adapter.rb
49
51
  - lib/em-synchrony.rb
50
52
  - lib/em-synchrony/activerecord.rb
53
+ - lib/em-synchrony/activerecord_4_2.rb
51
54
  - lib/em-synchrony/amqp.rb
52
55
  - lib/em-synchrony/connection_pool.rb
53
56
  - lib/em-synchrony/core_ext.rb
@@ -61,6 +64,7 @@ files:
61
64
  - lib/em-synchrony/em-remcached.rb
62
65
  - lib/em-synchrony/fiber_iterator.rb
63
66
  - lib/em-synchrony/iterator.rb
67
+ - lib/em-synchrony/kernel.rb
64
68
  - lib/em-synchrony/keyboard.rb
65
69
  - lib/em-synchrony/mechanize.rb
66
70
  - lib/em-synchrony/mongo.rb
@@ -83,6 +87,7 @@ files:
83
87
  - spec/http_spec.rb
84
88
  - spec/inlinesync_spec.rb
85
89
  - spec/iterator_spec.rb
90
+ - spec/kernel_override_spec.rb
86
91
  - spec/keyboard_spec.rb
87
92
  - spec/memcache_spec.rb
88
93
  - spec/mongo_spec.rb
@@ -95,6 +100,7 @@ files:
95
100
  - spec/tcpsocket_spec.rb
96
101
  - spec/thread_spec.rb
97
102
  - spec/timer_spec.rb
103
+ - spec/widgets.sql
98
104
  homepage: http://github.com/igrigorik/em-synchrony
99
105
  licenses:
100
106
  - MIT
@@ -114,8 +120,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
120
  - !ruby/object:Gem::Version
115
121
  version: '0'
116
122
  requirements: []
117
- rubyforge_project: em-synchrony
118
- rubygems_version: 2.4.3
123
+ rubyforge_project:
124
+ rubygems_version: 2.4.5.1
119
125
  signing_key:
120
126
  specification_version: 4
121
127
  summary: Fiber aware EventMachine libraries
@@ -135,6 +141,7 @@ test_files:
135
141
  - spec/http_spec.rb
136
142
  - spec/inlinesync_spec.rb
137
143
  - spec/iterator_spec.rb
144
+ - spec/kernel_override_spec.rb
138
145
  - spec/keyboard_spec.rb
139
146
  - spec/memcache_spec.rb
140
147
  - spec/mongo_spec.rb
@@ -147,3 +154,5 @@ test_files:
147
154
  - spec/tcpsocket_spec.rb
148
155
  - spec/thread_spec.rb
149
156
  - spec/timer_spec.rb
157
+ - spec/widgets.sql
158
+ has_rdoc: