spawnling 2.1.4 → 2.1.5
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -5
- data/lib/patches.rb +9 -3
- data/lib/spawnling.rb +13 -9
- data/lib/spawnling/version.rb +1 -1
- data/spawnling.gemspec +6 -2
- data/spec/spawn/spawn_spec.rb +29 -9
- data/spec/spec_helper.rb +25 -3
- metadata +61 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46683af41ff0f9b4d4078d02a1009371670f1c0e
|
4
|
+
data.tar.gz: 114aa427aabb0bfc096967528b53fb1ca6a2aed8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fefb1f49fa3a27b0b3fd8d5d645738fe27623881e01e804946e4c9645231443067fea45df43e26be5f5f92b4626165dbf81f22e510f3809a1b22b9946a72745a
|
7
|
+
data.tar.gz: 8601bbf865be9fac8277b402d25418e4125305d0bd01b573f86a0a67bbabd2f429f9bb08bd2e8c49eb6fbd714c00339a209e84ba76a911717398050d0b1e9f4a
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.travis.yml
CHANGED
@@ -5,15 +5,14 @@ rvm:
|
|
5
5
|
- 2.0
|
6
6
|
- 2.1
|
7
7
|
gemfile:
|
8
|
-
- gemfiles/rails2.gemfile
|
9
8
|
- gemfiles/rails3.gemfile
|
10
9
|
- gemfiles/rails4.gemfile
|
10
|
+
env:
|
11
|
+
- NONE=true
|
12
|
+
- RAILS=true
|
13
|
+
- RAILS=true MEMCACHE=true
|
11
14
|
matrix:
|
12
15
|
exclude:
|
13
|
-
- rvm: 2.0
|
14
|
-
gemfile: gemfiles/rails2.gemfile
|
15
|
-
- rvm: 2.1
|
16
|
-
gemfile: gemfiles/rails2.gemfile
|
17
16
|
- rvm: 1.8.7
|
18
17
|
gemfile: gemfiles/rails4.gemfile
|
19
18
|
script: "bundle exec rake coverage"
|
data/lib/patches.rb
CHANGED
@@ -2,7 +2,11 @@ if defined?(ActiveRecord)
|
|
2
2
|
# see activerecord/lib/active_record/connection_adaptors/abstract/connection_specification.rb
|
3
3
|
class ActiveRecord::Base
|
4
4
|
# reconnect without disconnecting
|
5
|
-
if ::Spawnling::RAILS_3_x
|
5
|
+
if ::Spawnling::RAILS_3_x
|
6
|
+
def self.spawn_reconnect(klass=self)
|
7
|
+
ActiveRecord::Base.connection.reconnect!
|
8
|
+
end
|
9
|
+
elsif ::Spawnling::RAILS_2_2
|
6
10
|
def self.spawn_reconnect(klass=self)
|
7
11
|
# keep ancestors' connection_handlers around to avoid them being garbage collected in the forked child
|
8
12
|
@@ancestor_connection_handlers ||= []
|
@@ -130,6 +134,8 @@ if need_passenger_patch
|
|
130
134
|
end
|
131
135
|
end
|
132
136
|
|
133
|
-
if defined?(
|
134
|
-
::ActiveSupport::Cache::MemCacheStore
|
137
|
+
if defined?(Rails)
|
138
|
+
if defined?(::ActiveSupport::Cache::MemCacheStore) && Rails.cache.class.name == 'ActiveSupport::Cache::MemCacheStore'
|
139
|
+
::ActiveSupport::Cache::MemCacheStore.delegate :reset, :to => :@data
|
140
|
+
end
|
135
141
|
end
|
data/lib/spawnling.rb
CHANGED
@@ -95,7 +95,7 @@ class Spawnling
|
|
95
95
|
# :method => :thread or override the default behavior in the environment by setting
|
96
96
|
# 'Spawnling::method :thread'.
|
97
97
|
def initialize(opts = {}, &block)
|
98
|
-
self.class.run(opts, &block)
|
98
|
+
@type, @handle = self.class.run(opts, &block)
|
99
99
|
end
|
100
100
|
|
101
101
|
def self.run(opts = {}, &block)
|
@@ -109,15 +109,13 @@ class Spawnling
|
|
109
109
|
elsif options[:method] == :thread
|
110
110
|
# for versions before 2.2, check for allow_concurrency
|
111
111
|
if allow_concurrency?
|
112
|
-
|
113
|
-
@handle = thread_it(options) { yield }
|
112
|
+
return :thread, thread_it(options) { yield }
|
114
113
|
else
|
115
114
|
@@logger.error("spawn(:method=>:thread) only allowed when allow_concurrency=true")
|
116
115
|
raise "spawn requires config.active_record.allow_concurrency=true when used with :method=>:thread"
|
117
116
|
end
|
118
117
|
else
|
119
|
-
|
120
|
-
@handle = fork_it(options) { yield }
|
118
|
+
return :fork, fork_it(options) { yield }
|
121
119
|
end
|
122
120
|
end
|
123
121
|
|
@@ -125,7 +123,7 @@ class Spawnling
|
|
125
123
|
return true if RAILS_2_2
|
126
124
|
if defined?(ActiveRecord) && ActiveRecord::Base.respond_to?(:allow_concurrency)
|
127
125
|
ActiveRecord::Base.allow_concurrency
|
128
|
-
elsif defined?(Rails)
|
126
|
+
elsif defined?(Rails) && Rails.application
|
129
127
|
Rails.application.config.allow_concurrency
|
130
128
|
else
|
131
129
|
true # assume user knows what they are doing
|
@@ -146,7 +144,7 @@ class Spawnling
|
|
146
144
|
end
|
147
145
|
end
|
148
146
|
# clean up connections from expired threads
|
149
|
-
|
147
|
+
clean_connections
|
150
148
|
end
|
151
149
|
|
152
150
|
protected
|
@@ -218,11 +216,11 @@ class Spawnling
|
|
218
216
|
|
219
217
|
def self.thread_it(options)
|
220
218
|
# clean up stale connections from previous threads
|
221
|
-
|
219
|
+
clean_connections
|
222
220
|
thr = Thread.new do
|
223
221
|
# run the long-running code block
|
224
222
|
if defined?(ActiveRecord)
|
225
|
-
ActiveRecord::Base.connection_pool.with_connection { yield
|
223
|
+
ActiveRecord::Base.connection_pool.with_connection { yield }
|
226
224
|
else
|
227
225
|
yield
|
228
226
|
end
|
@@ -231,6 +229,12 @@ class Spawnling
|
|
231
229
|
return thr
|
232
230
|
end
|
233
231
|
|
232
|
+
def self.clean_connections
|
233
|
+
return unless defined? ActiveRecord
|
234
|
+
ActiveRecord::Base.verify_active_connections! if ActiveRecord::Base.respond_to?(:verify_active_connections!)
|
235
|
+
ActiveRecord::Base.clear_active_connections! if ActiveRecord::Base.respond_to?(:clear_active_connections!)
|
236
|
+
end
|
237
|
+
|
234
238
|
# In case we don't have rails, can't call opts.symbolize_keys
|
235
239
|
def self.symbolize_options(hash)
|
236
240
|
hash.inject({}) do |new_hash, (key, value)|
|
data/lib/spawnling/version.rb
CHANGED
data/spawnling.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.name = "spawnling"
|
8
8
|
s.version = Spawnling::VERSION
|
9
9
|
|
10
|
-
s.authors = ['Tom Anderson']
|
11
|
-
s.email = ['tom@squeat.com']
|
10
|
+
s.authors = ['Tom Anderson', 'Michael Noack']
|
11
|
+
s.email = ['tom@squeat.com', 'michael+spawnling@noack.com.au']
|
12
12
|
|
13
13
|
s.homepage = %q{http://github.com/tra/spawnling}
|
14
14
|
s.license = "MIT"
|
@@ -29,6 +29,10 @@ threads (see lib/patches.rb).}
|
|
29
29
|
s.add_development_dependency 'bundler'
|
30
30
|
s.add_development_dependency 'rake'
|
31
31
|
s.add_development_dependency 'rspec', '~> 2.0'
|
32
|
+
s.add_development_dependency 'simplecov'
|
33
|
+
s.add_development_dependency 'simplecov-rcov'
|
32
34
|
s.add_development_dependency 'coveralls'
|
33
35
|
s.add_development_dependency 'rails'
|
36
|
+
s.add_development_dependency 'activerecord-nulldb-adapter'
|
37
|
+
s.add_development_dependency 'dalli'
|
34
38
|
end
|
data/spec/spawn/spawn_spec.rb
CHANGED
@@ -14,32 +14,32 @@ describe Spawnling do
|
|
14
14
|
object.do_something
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "should be able to yield directly" do
|
19
19
|
spawn!.should == "hello"
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
describe "override" do
|
24
24
|
before(:each) do
|
25
25
|
Spawnling::default_options :method => proc{ "foo" }
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "should be able to return a proc" do
|
29
29
|
spawn!.should == "foo"
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
describe "delegate to a proc" do
|
35
35
|
before(:each) do
|
36
36
|
Spawnling::default_options :method => proc{ |block| block }
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
it "should be able to return a proc" do
|
40
40
|
spawn!.should be_kind_of(Proc)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "should be able to return a proc" do
|
44
44
|
spawn!.call.should == "hello"
|
45
45
|
end
|
@@ -57,8 +57,18 @@ describe Spawnling do
|
|
57
57
|
sleep(0.1) # wait for file to finish writing
|
58
58
|
Store.flag.should be_truthy
|
59
59
|
end
|
60
|
+
|
61
|
+
it "instance should have a type" do
|
62
|
+
instance = Spawnling.new{}
|
63
|
+
instance.type.should be(:thread)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "instance should have a handle" do
|
67
|
+
instance = Spawnling.new{}
|
68
|
+
instance.handle.should_not be_nil
|
69
|
+
end
|
60
70
|
end
|
61
|
-
|
71
|
+
|
62
72
|
describe "fork it" do
|
63
73
|
before(:each) do
|
64
74
|
Store.reset!
|
@@ -71,6 +81,16 @@ describe Spawnling do
|
|
71
81
|
sleep(0.1) # wait for file to finish writing
|
72
82
|
Store.flag.should be_truthy
|
73
83
|
end
|
84
|
+
|
85
|
+
it "instance should have a type" do
|
86
|
+
instance = Spawnling.new{}
|
87
|
+
instance.type.should be(:fork)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "instance should have a handle" do
|
91
|
+
instance = Spawnling.new{}
|
92
|
+
instance.handle.should_not be_nil
|
93
|
+
end
|
74
94
|
end
|
75
95
|
|
76
96
|
def spawn!
|
@@ -84,5 +104,5 @@ describe Spawnling do
|
|
84
104
|
Store.flag!
|
85
105
|
end
|
86
106
|
end
|
87
|
-
|
107
|
+
|
88
108
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,18 +5,41 @@ require 'rspec'
|
|
5
5
|
$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
|
6
6
|
|
7
7
|
require 'store'
|
8
|
+
if ENV['RAILS']
|
9
|
+
require 'rails'
|
10
|
+
require 'active_record'
|
11
|
+
end
|
12
|
+
ActiveRecord::Base.establish_connection :adapter => :nulldb if defined?(ActiveRecord)
|
13
|
+
|
14
|
+
MINIMUM_COVERAGE = 53
|
15
|
+
|
16
|
+
if ENV['RAILS']
|
17
|
+
class Application < Rails::Application
|
18
|
+
config.log_level = :warn
|
19
|
+
config.logger = Logger.new(STDOUT)
|
20
|
+
end
|
21
|
+
Application.initialize!
|
22
|
+
Application.config.allow_concurrency = true
|
23
|
+
end
|
8
24
|
|
9
|
-
|
25
|
+
if ENV['MEMCACHE']
|
26
|
+
Application.config.cache_store = :mem_cache_store
|
27
|
+
end
|
10
28
|
|
11
29
|
if ENV['COVERAGE']
|
12
30
|
require 'simplecov'
|
31
|
+
require 'simplecov-rcov'
|
13
32
|
require 'coveralls'
|
14
33
|
Coveralls.wear!
|
15
34
|
|
16
|
-
SimpleCov.formatter =
|
35
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
36
|
+
SimpleCov::Formatter::RcovFormatter,
|
37
|
+
Coveralls::SimpleCov::Formatter
|
38
|
+
]
|
17
39
|
SimpleCov.start do
|
18
40
|
add_filter '/vendor/'
|
19
41
|
add_filter '/spec/'
|
42
|
+
add_filter '/lib/patches.rb'
|
20
43
|
add_group 'lib', 'lib'
|
21
44
|
end
|
22
45
|
SimpleCov.at_exit do
|
@@ -31,4 +54,3 @@ end
|
|
31
54
|
|
32
55
|
require 'spawnling'
|
33
56
|
|
34
|
-
Spawnling.logger = nil
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spawnling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Anderson
|
8
|
+
- Michael Noack
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-06
|
12
|
+
date: 2014-07-06 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
@@ -52,6 +53,34 @@ dependencies:
|
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '2.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: simplecov
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: simplecov-rcov
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
55
84
|
- !ruby/object:Gem::Dependency
|
56
85
|
name: coveralls
|
57
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +109,34 @@ dependencies:
|
|
80
109
|
- - ">="
|
81
110
|
- !ruby/object:Gem::Version
|
82
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: activerecord-nulldb-adapter
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: dalli
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
83
140
|
description: |-
|
84
141
|
This plugin provides a 'Spawnling' class to easily fork OR
|
85
142
|
thread long-running sections of code so that your application can return
|
@@ -90,11 +147,13 @@ description: |-
|
|
90
147
|
threads (see lib/patches.rb).
|
91
148
|
email:
|
92
149
|
- tom@squeat.com
|
150
|
+
- michael+spawnling@noack.com.au
|
93
151
|
executables: []
|
94
152
|
extensions: []
|
95
153
|
extra_rdoc_files: []
|
96
154
|
files:
|
97
155
|
- ".gitignore"
|
156
|
+
- ".rspec"
|
98
157
|
- ".travis.yml"
|
99
158
|
- CHANGELOG
|
100
159
|
- Gemfile
|