em-synchrony 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c9fce19d87bacaaddaf2d367cf360ddc1b84c7b1
4
+ data.tar.gz: 61be19297e6ee682210f7275ef29085060ade75f
5
+ SHA512:
6
+ metadata.gz: f963c206f3d8e4fe10bb4c1b67494915b65ae1a2b8a4c2551e51e8ee651c3dae2edc188452de23e92646990c7b1dee45232e8688014592ba7fa162a1b431a236
7
+ data.tar.gz: b2aac7705b2c345c1f9607443567c10f18edc190a0070193713d89b69e5d5f31f07d3746da0c6091c03472841431064bc7062be955f0d9040e93ff1769235b6b
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # EM-Synchrony
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/em-synchrony.png)](http://rubygems.org/gems/em-synchrony)
4
+ [![Analytics](https://ga-beacon.appspot.com/UA-71196-10/em-synchrony/readme)](https://github.com/igrigorik/ga-beacon)
5
+
3
6
  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).
4
7
 
5
8
  * Fiber aware ConnectionPool with sync/async query support
@@ -171,4 +174,4 @@ result = Widget.all.to_a
171
174
 
172
175
  # License
173
176
 
174
- The MIT License - Copyright (c) 2011 Ilya Grigorik
177
+ The MIT License - Copyright (c) 2011 Ilya Grigorik
@@ -3,11 +3,12 @@ $:.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.3"
6
+ s.version = "1.0.4"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Ilya Grigorik"]
9
9
  s.email = ["ilya@igvita.com"]
10
10
  s.homepage = "http://github.com/igrigorik/em-synchrony"
11
+ s.license = "MIT"
11
12
  s.summary = %q{Fiber aware EventMachine libraries}
12
13
  s.description = s.summary
13
14
 
@@ -135,5 +135,13 @@ module EventMachine
135
135
  def self.gets
136
136
  EventMachine::Synchrony::Keyboard.new.gets
137
137
  end
138
+
139
+ # Interrupt current fiber to give chance to other fibers
140
+ #
141
+ def self.interrupt
142
+ fiber = Fiber.current
143
+ EM.next_tick { fiber.resume }
144
+ Fiber.yield
145
+ end
138
146
  end
139
147
  end
@@ -66,6 +66,47 @@ module EM::Synchrony
66
66
  def decrement_open_transactions
67
67
  real_connection.open_transactions -= 1
68
68
  end
69
+
70
+ def current_transaction #:nodoc:
71
+ @transaction[Fiber.current.object_id] || @closed_transaction
72
+ end
73
+
74
+ def transaction_open?
75
+ current_transaction.open?
76
+ end
77
+
78
+ def begin_transaction(options = {}) #:nodoc:
79
+ set_current_transaction(current_transaction.begin(options))
80
+ end
81
+
82
+ def commit_transaction #:nodoc:
83
+ set_current_transaction(current_transaction.commit)
84
+ end
85
+
86
+ def rollback_transaction #:nodoc:
87
+ set_current_transaction(current_transaction.rollback)
88
+ end
89
+
90
+ def reset_transaction #:nodoc:
91
+ @transaction = {}
92
+ @closed_transaction = ::ActiveRecord::ConnectionAdapters::ClosedTransaction.new(self)
93
+ end
94
+
95
+ # Register a record with the current transaction so that its after_commit and after_rollback callbacks
96
+ # can be called.
97
+ def add_transaction_record(record)
98
+ current_transaction.add_record(record)
99
+ end
100
+
101
+ protected
102
+
103
+ def set_current_transaction(t)
104
+ if t == @closed_transaction
105
+ @transaction.delete(Fiber.current.object_id)
106
+ else
107
+ @transaction[Fiber.current.object_id] = t
108
+ end
109
+ end
69
110
  end
70
111
 
71
112
  class ConnectionPool < EM::Synchrony::ConnectionPool
@@ -100,4 +141,4 @@ module EM::Synchrony
100
141
  end
101
142
  end
102
143
  end
103
- end
144
+ end
@@ -1,7 +1,7 @@
1
1
  begin
2
2
  require "amqp"
3
3
  require "amq/protocol"
4
- rescue LoadError => error
4
+ rescue LoadError
5
5
  raise "Missing EM-Synchrony dependency: gem install amqp"
6
6
  end
7
7
 
@@ -22,7 +22,7 @@ module EventMachine
22
22
  if fiber == Fiber.current
23
23
  return *args
24
24
  else
25
- fiber.resume *args
25
+ fiber.resume(*args)
26
26
  end
27
27
  end
28
28
  end
@@ -54,7 +54,7 @@ module EventMachine
54
54
  def #{type}(name = 'amq.#{type}', opts = {})
55
55
  if exchange = find_exchange(name)
56
56
  extended_opts = Exchange.add_default_options(:#{type}, name, opts, nil)
57
- validate_parameters_match!(exchange, extended_opts)
57
+ validate_parameters_match!(exchange, extended_opts, :exchange)
58
58
  exchange
59
59
  else
60
60
  register_exchange(Exchange.new(self, :#{type}, name, opts))
@@ -27,6 +27,17 @@ module EventMachine
27
27
  release(f) if not async
28
28
  end
29
29
  end
30
+
31
+ # Returns current pool utilization.
32
+ #
33
+ # @return [Hash] Current utilization.
34
+ def pool_status
35
+ {
36
+ available: @available.size,
37
+ reserved: @reserved.size,
38
+ pending: @pending.size
39
+ }
40
+ end
30
41
 
31
42
  private
32
43
 
@@ -6,94 +6,108 @@ end
6
6
 
7
7
  module EventMachine
8
8
  module Hiredis
9
-
9
+
10
10
  def self.connect(uri = nil)
11
11
  client = setup(uri)
12
12
  EM::Synchrony.sync client.connect
13
13
  client
14
14
  end
15
-
15
+
16
16
  class Client
17
+ def pubsub
18
+ return @pubsub if @pubsub
19
+
20
+ client = PubsubClient.new(@host, @port, @password, @db)
21
+ EM::Synchrony.sync client.connect
22
+ @pubsub = client
23
+ end
24
+ end
25
+
26
+ class BaseClient
17
27
  def self.connect(host = 'localhost', port = 6379)
18
28
  conn = new(host, port)
19
29
  EM::Synchrony.sync conn.connect
20
30
  conn
21
31
  end
22
-
32
+
23
33
  def connect
34
+ @auto_reconnect = true
24
35
  @connection = EM.connect(@host, @port, Connection, @host, @port)
25
-
36
+
26
37
  @connection.on(:closed) do
27
38
  if @connected
28
- @defs.each { |d| d.fail("Redis disconnected") }
39
+ @defs.each { |d| d.fail(Error.new("Redis disconnected")) }
29
40
  @defs = []
30
41
  @deferred_status = nil
31
42
  @connected = false
32
- unless @closing_connection
33
- @reconnecting = true
34
- reconnect
43
+ if @auto_reconnect
44
+ # Next tick avoids reconnecting after for example EM.stop
45
+ EM.next_tick { reconnect }
35
46
  end
47
+ emit(:disconnected)
48
+ EM::Hiredis.logger.info("#{@connection} Disconnected")
36
49
  else
37
- unless @closing_connection
38
- EM.add_timer(1) { reconnect }
50
+ if @auto_reconnect
51
+ @reconnect_failed_count += 1
52
+ @reconnect_timer = EM.add_timer(EM::Hiredis.reconnect_timeout) {
53
+ @reconnect_timer = nil
54
+ reconnect
55
+ }
56
+ emit(:reconnect_failed, @reconnect_failed_count)
57
+ EM::Hiredis.logger.info("#{@connection} Reconnect failed")
58
+
59
+ if @reconnect_failed_count >= 4
60
+ emit(:failed)
61
+ self.fail(Error.new("Could not connect after 4 attempts"))
62
+ end
39
63
  end
40
64
  end
41
65
  end
42
-
66
+
43
67
  @connection.on(:connected) do
44
68
  Fiber.new do
45
69
  @connected = true
46
-
70
+ @reconnect_failed_count = 0
71
+ @failed = false
72
+
73
+ select(@db) unless @db == 0
47
74
  auth(@password) if @password
48
- select(@db) if @db
49
-
50
- @subs.each { |s| method_missing(:subscribe, s) }
51
- @psubs.each { |s| method_missing(:psubscribe, s) }
75
+
76
+ @command_queue.each do |df, command, args|
77
+ @connection.send_command(command, args)
78
+ @defs.push(df)
79
+ end
80
+ @command_queue = []
81
+
82
+ emit(:connected)
83
+ EM::Hiredis.logger.info("#{@connection} Connected")
52
84
  succeed
53
-
85
+
54
86
  if @reconnecting
55
87
  @reconnecting = false
56
88
  emit(:reconnected)
57
89
  end
58
90
  end.resume
59
91
  end
60
-
92
+
61
93
  @connection.on(:message) do |reply|
62
94
  if RuntimeError === reply
63
95
  raise "Replies out of sync: #{reply.inspect}" if @defs.empty?
64
96
  deferred = @defs.shift
65
- deferred.fail(reply) if deferred
97
+ error = RedisError.new(reply.message)
98
+ error.redis_error = reply
99
+ deferred.fail(error) if deferred
66
100
  else
67
- if reply && PUBSUB_MESSAGES.include?(reply[0]) # reply can be nil
68
- kind, subscription, d1, d2 = *reply
69
-
70
- case kind.to_sym
71
- when :message
72
- emit(:message, subscription, d1)
73
- when :pmessage
74
- emit(:pmessage, subscription, d1, d2)
75
- end
76
- else
77
- if @defs.empty?
78
- if @monitoring
79
- emit(:monitor, reply)
80
- else
81
- raise "Replies out of sync: #{reply.inspect}"
82
- end
83
- else
84
- deferred = @defs.shift
85
- deferred.succeed(reply) if deferred
86
- end
87
- end
101
+ handle_reply(reply)
88
102
  end
89
103
  end
90
-
104
+
91
105
  @connected = false
92
106
  @reconnecting = false
93
-
107
+
94
108
  return self
95
109
  end
96
-
110
+
97
111
  alias :old_method_missing :method_missing
98
112
  def method_missing(sym, *args)
99
113
  EM::Synchrony.sync old_method_missing(sym, *args)
@@ -0,0 +1,27 @@
1
+ require 'mechanize'
2
+
3
+ module EventMachine
4
+ module Synchrony
5
+ class Mechanize < ::Mechanize
6
+ def initialize(*args, &blk)
7
+ super
8
+ @agent.instance_variable_get(:@http).singleton_class.send(:include, DeferedNetHttpPersistentRequest)
9
+ end
10
+
11
+ module DeferedNetHttpPersistentRequest
12
+ def self.included(base)
13
+ base.class_eval do
14
+ alias :request_without_defer :request
15
+ alias :request :request_with_defer
16
+ end
17
+ end
18
+
19
+ def request_with_defer(*args, &blk)
20
+ EM::Synchrony.defer do
21
+ request_without_defer(*args, &blk)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -85,7 +85,13 @@ module EventMachine
85
85
  def read(num_bytes = nil, dest = nil)
86
86
  handle_read(:read, num_bytes, dest)
87
87
  end
88
- alias_method :read_nonblock, :read
88
+
89
+ def read_nonblock(maxlen, dest = nil)
90
+ raise ArgumentError, "maxlen must be > 0" if !maxlen || maxlen <= 0
91
+ read_bytes = handle_read(:read_nonblock, maxlen, dest)
92
+ raise EOFError if read_bytes.nil?
93
+ read_bytes
94
+ end
89
95
 
90
96
  def recv(num_bytes, flags = 0)
91
97
  raise "Unknown flags in recv(): #{flags}" if flags.nonzero?
@@ -159,11 +165,14 @@ module EventMachine
159
165
  end
160
166
 
161
167
  def try_read_data
162
- if @read_type == :read
168
+ if @read_type == :read || @read_type == :read_nonblock
169
+ nonblocking = @read_type == :read_nonblock
163
170
  unless @remote_closed
164
171
  if @read_bytes
165
172
  # read(n) on an open socket, with >= than n buffered data, returns n data
166
- if @in_buff.size >= @read_bytes then @in_buff.slice!(0, @read_bytes)
173
+ if (@in_buff.size >= @read_bytes ||
174
+ (nonblocking && @in_buff.size > 0)) then
175
+ @in_buff.slice!(0, @read_bytes)
167
176
  # read(n) on an open socket, with < than n buffered data, blocks
168
177
  else :block end
169
178
  else
@@ -54,15 +54,13 @@ describe EM::Synchrony::AMQP do
54
54
  exchange = EM::Synchrony::AMQP::Exchange.new(channel, :fanout, "test.em-synchrony.exchange")
55
55
  exchange.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
56
56
 
57
- direct = channel.direct("test.em-synchrony.direct")
58
- fanout = channel.fanout("test.em-synchrony.fanout")
59
- topic = channel.topic("test.em-synchrony.topic")
60
- headers = channel.headers("test.em-synchrony.headers")
61
-
62
- direct.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
63
- fanout.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
64
- topic.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
65
- headers.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
57
+ [:direct, :fanout, :topic, :headers].each do |type|
58
+ # Exercise cached exchange code path
59
+ 2.times.map { channel.send(type, "test.em-synchrony.#{type}") }.each do |ex|
60
+ ex.should be_kind_of(EventMachine::Synchrony::AMQP::Exchange)
61
+ end
62
+ end
63
+
66
64
  EM.stop
67
65
  end
68
66
  end
@@ -126,4 +126,49 @@ describe EventMachine::Synchrony::ConnectionPool do
126
126
  end
127
127
  end
128
128
 
129
- end
129
+ describe '#pool_status' do
130
+ it 'should return right initial size' do
131
+ (1..10).each do |count|
132
+ pool = EventMachine::Synchrony::ConnectionPool.new(size: count) { }
133
+ status = pool.pool_status
134
+ expect(status).to include available: count
135
+ expect(status).to include reserved: 0
136
+ expect(status).to include pending: 0
137
+ end
138
+ end
139
+ it 'should return up-to-date statusrmation' do
140
+ sleep = 0.5
141
+ count = 5
142
+ EM.run do
143
+ pool = EM::Synchrony::ConnectionPool.new(size: count) do
144
+ -> { EM::Synchrony.sleep(sleep) }
145
+ end
146
+ (1..count).each do |used|
147
+ Fiber.new { pool.call }.resume
148
+ status = pool.pool_status
149
+ expect(status).to include available: count - used
150
+ expect(status).to include reserved: used
151
+ expect(status).to include pending: 0
152
+ end
153
+ (1..count).each do |used|
154
+ Fiber.new { pool.call }.resume
155
+ status = pool.pool_status
156
+ expect(status).to include available: 0
157
+ expect(status).to include reserved: count
158
+ expect(status).to include pending: used
159
+ end
160
+ Fiber.new {
161
+ EM::Synchrony.sleep(sleep + 0.1)
162
+ expect(pool.pool_status).to include pending: 0
163
+
164
+ EM::Synchrony.sleep(sleep + 0.1)
165
+ status = pool.pool_status
166
+ expect(status).to include available: count
167
+ expect(status).to include reserved: 0
168
+ expect(status).to include pending: 0
169
+ EM.stop
170
+ }.resume
171
+ end
172
+ end
173
+ end
174
+ end
@@ -1,9 +1,4 @@
1
- require 'rubygems'
2
- require 'rspec'
3
- require 'pp'
4
-
5
- require 'lib/em-synchrony'
6
- require 'lib/em-synchrony/em-http'
1
+ require 'spec/helper/core'
7
2
  require 'lib/em-synchrony/mysql2'
8
3
  require 'lib/em-synchrony/em-remcached'
9
4
  require 'lib/em-synchrony/em-memcache'
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+ require 'pp'
4
+
5
+ require 'lib/em-synchrony'
6
+ require 'lib/em-synchrony/em-http'
@@ -1,4 +1,4 @@
1
- require "spec/helper/all"
1
+ require "spec/helper/core"
2
2
 
3
3
  module SendAndClose
4
4
  def post_init
@@ -21,15 +21,13 @@ module SendAndKeepOpen
21
21
  end
22
22
 
23
23
  def tcp_test(server_type, ops={}, &block)
24
- Proc.new do
25
- EventMachine.synchrony do
26
- ops = {:stop => true}.merge ops
27
- EM::start_server('localhost', 12345, server_type)
28
- @socket = EventMachine::Synchrony::TCPSocket.new 'localhost', 12345
29
- @socket.close if ops[:close]
30
- block.call
31
- EM.stop if ops[:stop]
32
- end
24
+ EventMachine.synchrony do
25
+ ops = {:stop => true}.merge ops
26
+ EM::start_server('localhost', 12345, server_type)
27
+ @socket = EventMachine::Synchrony::TCPSocket.new 'localhost', 12345
28
+ @socket.close if ops[:close]
29
+ block.call
30
+ EM.stop if ops[:stop]
33
31
  end
34
32
  end
35
33
 
@@ -231,6 +229,82 @@ describe EventMachine::Synchrony::TCPSocket do
231
229
  end
232
230
  end
233
231
 
232
+ context '#read_nonblock' do
233
+ context 'with a positive length argument' do
234
+ context 'when the connection is open' do
235
+ context 'with greater or equal than the requested data buffered' do
236
+ it 'returns the requested data and no more' do
237
+ tcp_test(SendAndKeepOpen) do
238
+ @socket.read_nonblock(2).size.should eq 2
239
+ @socket.read_nonblock(1).size.should eq 1
240
+ end
241
+ end
242
+ end
243
+ context 'with less than the requested data buffered' do
244
+ it 'returns the available data' do
245
+ tcp_test(SendAndKeepOpen) do
246
+ @socket.read_nonblock(10).size.should eq 4
247
+ end
248
+ end
249
+ end
250
+ end
251
+ context 'when the peer has closed the connection' do
252
+ context 'with no data buffered' do
253
+ it 'raises EOFError' do
254
+ tcp_test(SendAndClose) do
255
+ @socket.read_nonblock(4).size.should eq 4
256
+ lambda {
257
+ @socket.read_nonblock(1)
258
+ }.should raise_error(EOFError)
259
+ end
260
+ end
261
+ end
262
+ context 'with less than the requested data buffered' do
263
+ it 'returns the buffered data' do
264
+ tcp_test(SendAndClose) do
265
+ @socket.read_nonblock(50).size.should eq 4
266
+ end
267
+ end
268
+ end
269
+ context 'with greater or equal than the requested data buffered' do
270
+ it 'returns the requested data and no more' do
271
+ tcp_test(SendAndClose) do
272
+ @socket = EventMachine::Synchrony::TCPSocket.new 'localhost', 12345
273
+ @socket.read_nonblock(2).size.should eq 2
274
+ end
275
+ end
276
+ end
277
+ end
278
+ context 'when we closed the connection' do
279
+ it 'raises IOError' do
280
+ tcp_test(SendAndKeepOpen, :close => true) do
281
+ proc {
282
+ @socket.read_nonblock(4)
283
+ }.should raise_error(IOError)
284
+ end
285
+ end
286
+ end
287
+ end
288
+ context 'with a negative length argument' do
289
+ it 'raises ArgumentError' do
290
+ tcp_test(SendAndKeepOpen) do
291
+ proc {
292
+ @socket.read_nonblock(-10)
293
+ }.should raise_error(ArgumentError)
294
+ end
295
+ end
296
+ end
297
+ context 'with a zero length argument' do
298
+ it 'raises ArgumentError' do
299
+ tcp_test(SendAndKeepOpen) do
300
+ proc {
301
+ @socket.read_nonblock(0)
302
+ }.should raise_error(ArgumentError)
303
+ end
304
+ end
305
+ end
306
+ end
307
+
234
308
  context '#recv' do
235
309
  context 'with a length argument' do
236
310
  context 'with a possitive length argument' do
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-synchrony
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
5
- prerelease:
4
+ version: 1.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ilya Grigorik
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-21 00:00:00.000000000 Z
11
+ date: 2015-01-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: eventmachine
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.0.0.beta.1
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.0.0.beta.1
30
27
  description: Fiber aware EventMachine libraries
@@ -34,8 +31,8 @@ executables: []
34
31
  extensions: []
35
32
  extra_rdoc_files: []
36
33
  files:
37
- - .gitignore
38
- - .rspec
34
+ - ".gitignore"
35
+ - ".rspec"
39
36
  - Gemfile
40
37
  - README.md
41
38
  - Rakefile
@@ -65,6 +62,7 @@ files:
65
62
  - lib/em-synchrony/fiber_iterator.rb
66
63
  - lib/em-synchrony/iterator.rb
67
64
  - lib/em-synchrony/keyboard.rb
65
+ - lib/em-synchrony/mechanize.rb
68
66
  - lib/em-synchrony/mongo.rb
69
67
  - lib/em-synchrony/mongoid.rb
70
68
  - lib/em-synchrony/mysql2.rb
@@ -78,6 +76,7 @@ files:
78
76
  - spec/em-mongo_spec.rb
79
77
  - spec/fiber_iterator_spec.rb
80
78
  - spec/helper/all.rb
79
+ - spec/helper/core.rb
81
80
  - spec/helper/stub-http-server.rb
82
81
  - spec/helper/tolerance_matcher.rb
83
82
  - spec/hiredis_spec.rb
@@ -97,28 +96,28 @@ files:
97
96
  - spec/thread_spec.rb
98
97
  - spec/timer_spec.rb
99
98
  homepage: http://github.com/igrigorik/em-synchrony
100
- licenses: []
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
101
102
  post_install_message:
102
103
  rdoc_options: []
103
104
  require_paths:
104
105
  - lib
105
106
  required_ruby_version: !ruby/object:Gem::Requirement
106
- none: false
107
107
  requirements:
108
- - - ! '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
- none: false
113
112
  requirements:
114
- - - ! '>='
113
+ - - ">="
115
114
  - !ruby/object:Gem::Version
116
115
  version: '0'
117
116
  requirements: []
118
117
  rubyforge_project: em-synchrony
119
- rubygems_version: 1.8.24
118
+ rubygems_version: 2.4.3
120
119
  signing_key:
121
- specification_version: 3
120
+ specification_version: 4
122
121
  summary: Fiber aware EventMachine libraries
123
122
  test_files:
124
123
  - spec/activerecord_spec.rb
@@ -129,6 +128,7 @@ test_files:
129
128
  - spec/em-mongo_spec.rb
130
129
  - spec/fiber_iterator_spec.rb
131
130
  - spec/helper/all.rb
131
+ - spec/helper/core.rb
132
132
  - spec/helper/stub-http-server.rb
133
133
  - spec/helper/tolerance_matcher.rb
134
134
  - spec/hiredis_spec.rb
@@ -147,4 +147,3 @@ test_files:
147
147
  - spec/tcpsocket_spec.rb
148
148
  - spec/thread_spec.rb
149
149
  - spec/timer_spec.rb
150
- has_rdoc: