lspace 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,7 +16,11 @@ class LSpace
16
16
  # @param [Proc] block The logical block that will be run in the clean LSpace
17
17
  # @see LSpace.enter
18
18
  def self.clean(&block)
19
- enter new({}, nil), &block
19
+ if block_given?
20
+ enter new({}, nil), &block
21
+ else
22
+ new({}, nil)
23
+ end
20
24
  end
21
25
 
22
26
  # Create a new LSpace with the given keys set to the given values, and run the
@@ -28,6 +28,31 @@ module EventMachine
28
28
  s
29
29
  end
30
30
  end
31
+
32
+ # By default EM::run will temporarily switch to a clean LSpace to ensure
33
+ # that all your around_filters are run for every block executed on the
34
+ # reactor.
35
+ #
36
+ # If you don't want this behaviour, you can call EM.run_in_current_lspace
37
+ # which will continue using the current lspace.
38
+ alias_method :run_in_current_lspace, :run
39
+
40
+ # Override run to ensure that the LSpace context is re-entered more
41
+ # appropriately.
42
+ #
43
+ # This ensures that all blocks scheduled on the eventmachine reactor will
44
+ # be wrapped in the around_filters you define, and makes implementing things
45
+ # like a global error handler, or em-monitor a little easier.
46
+ def run(*args, &block)
47
+ lspace = LSpace.current
48
+ LSpace.clean do
49
+ run_in_current_lspace(*args) do |*a, &b|
50
+ lspace.enter do
51
+ block.call *a, &b if block_given?
52
+ end
53
+ end
54
+ end
55
+ end
31
56
  end
32
57
 
33
58
  # Many EM APIs (e.g. em-http-request) are based on deferrables. Preserving lspace for
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "lspace"
3
- s.version = "0.7"
3
+ s.version = "0.8"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.author = "Conrad Irwin"
6
6
  s.email = "conrad.irwin@gmail.com"
@@ -132,5 +132,39 @@ describe LSpace do
132
132
  $server.should == [[:post_init, :server, :baz], [:receive_data, :server, :baz], [:unbind, :server, :baz]]
133
133
  $tick.should == [[:tick, :baz]]
134
134
  end
135
+
136
+ it "should ensure that around_filters defined outside EM::run are run on each callback inside the reactor" do
137
+ LSpace[:count] = 0
138
+ LSpace.around_filter do |&block|
139
+ LSpace[:count] += 1
140
+ block.call
141
+ end
142
+
143
+ LSpace[:count].should == 0
144
+ EM::run do
145
+ LSpace[:count].should == 1
146
+ EM::next_tick do
147
+ LSpace[:count].should == 2
148
+ EM::stop
149
+ end
150
+ end
151
+ end
152
+
153
+ it "should not re-enter LSpace if run_in_current_lspace is used" do
154
+ LSpace[:count] = 0
155
+ LSpace.around_filter do |&block|
156
+ LSpace[:count] += 1
157
+ block.call
158
+ end
159
+
160
+ LSpace[:count].should == 0
161
+ EM::run_in_current_lspace do
162
+ LSpace[:count].should == 0
163
+ EM::next_tick do
164
+ LSpace[:count].should == 0
165
+ EM::stop
166
+ end
167
+ end
168
+ end
135
169
  end
136
170
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lspace
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.7'
4
+ version: '0.8'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: