zeevex_threadsafe 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -7,15 +7,19 @@ require 'rspec/core/rake_task'
7
7
  RSpec::Core::RakeTask.new(:spec)
8
8
 
9
9
  namespace :spec do
10
+ SPEC_PLATFORMS = ENV.has_key?('SPEC_PLATFORMS') ?
11
+ ENV['SPEC_PLATFORMS'].split(/ +/) :
12
+ %w{1.9.3-p448 2.0.0-p247 1.8.7-p374}
13
+
10
14
  desc "Run on three Rubies"
11
15
  task :platforms do
12
- current = %x{rvm-prompt v}
16
+ # current = %x[rbenv version | awk '{print $1}']
13
17
 
14
18
  fail = false
15
- %w{1.8.7 1.9.2}.each do |version|
19
+ SPEC_PLATFORMS.each do |version|
16
20
  puts "Switching to #{version}"
17
21
  Bundler.with_clean_env do
18
- system %{bash -c 'source ~/.rvm/scripts/rvm && rvm #{version} && bundle exec rake spec'}
22
+ system %{bash -c 'eval "$(rbenv init -)" && rbenv use #{version} && rbenv rehash && ruby -v && bundle exec rake spec'}
19
23
  end
20
24
  if $?.exitstatus != 0
21
25
  fail = true
@@ -23,10 +27,23 @@ namespace :spec do
23
27
  end
24
28
  end
25
29
 
26
- system %{rvm #{current}}
27
-
28
30
  exit (fail ? 1 : 0)
29
31
  end
32
+
33
+ desc 'Install gems for all tested rubies'
34
+ task :platform_setup do
35
+ SPEC_PLATFORMS.each do |version|
36
+ puts "Setting up platform #{version}"
37
+ Bundler.with_clean_env do
38
+ system %{bash -c 'eval "$(rbenv init -)" && rbenv use #{version} && rbenv rehash && gem install bundler && bundle install'}
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ task :repl do
46
+ sh %q{ bundle exec irb -Ilib -r zeevex_threadsafe/synchronized }
30
47
  end
31
48
 
32
49
  task :default => 'spec'
@@ -0,0 +1,63 @@
1
+ require 'zeevex_proxy'
2
+ require 'thread'
3
+
4
+ #
5
+ # Wraps an object so that method calls to it via the proxy are synchronized.
6
+ #
7
+ # These are all equivalent:
8
+ #
9
+ # ZeevexThreadsafe::Synchronized.new(orig_object)
10
+ # ZeevexThreadsafe::Synchronized.wrap(orig_object)
11
+ # ZeevexThreadsafe.synchronized orig_object
12
+ #
13
+ # Each style of invocation returns a new proxy object which wraps
14
+ # orig_object such that every method invocation *through the proxy*
15
+ # will be synchronized with a per-object Mutex.
16
+ #
17
+ # Each style also accepts an optional second argument which is a Mutex
18
+ # (or anything that duck-types with Mutex#synchronize). This allows
19
+ # multiple objects to be synchronized on the same mutex.
20
+ #
21
+ # Note that internal method calls within the wrapped object are *not*
22
+ # synchronized. If any thread can access the wrapped object directly,
23
+ # then this class will not guarantee thread-safety.
24
+ #
25
+
26
+ module ZeevexThreadsafe
27
+ class Synchronized < ZeevexProxy::Base
28
+ def initialize(obj, mutex = Mutex.new)
29
+ super
30
+ @__synchronized_mutex = mutex
31
+ end
32
+
33
+ def method_missing(name, *args, &block)
34
+ @__synchronized_mutex.synchronize do
35
+ super
36
+ end
37
+ end
38
+
39
+ #
40
+ # Run a block within a synchronized block around this object's mutex
41
+ #
42
+ def synchronize(&block)
43
+ @__synchronized_mutex.synchronize do
44
+ yield
45
+ end
46
+ end
47
+
48
+ def self.wrap(*args)
49
+ Synchronized.new(*args)
50
+ end
51
+ end
52
+
53
+ def self.synchronized(*args)
54
+ ZeevexThreadsafe::Synchronized.wrap(*args)
55
+ end
56
+ end
57
+
58
+
59
+ #
60
+ #
61
+ #
62
+ # See also https://github.com/ryanlecompte/synchronizable
63
+ #
@@ -1,3 +1,3 @@
1
1
  module ZeevexThreadsafe
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -0,0 +1,10 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ require 'zeevex_threadsafe/synchronized'
5
+
6
+
7
+ describe ZeevexThreadsafe::Synchronized do
8
+
9
+
10
+ end
@@ -104,11 +104,11 @@ describe ZeevexThreadsafe::ThreadLocals do
104
104
 
105
105
  [:private_var].each do |key|
106
106
  it "should have defined reader for #{key}" do
107
- instance.private_methods.should include(key.to_s)
107
+ instance.private_methods.map(&:to_s).should include(key.to_s)
108
108
  end
109
109
 
110
110
  it "should have defined writer for #{key}" do
111
- instance.private_methods.should include(key.to_s + "=")
111
+ instance.private_methods.map(&:to_s).should include(key.to_s + "=")
112
112
  end
113
113
  end
114
114
  end
@@ -146,19 +146,19 @@ describe ZeevexThreadsafe::ThreadLocals do
146
146
 
147
147
  context "visibility" do
148
148
  it "should define methods as public by default" do
149
- instance.public_methods.should include("plain", "plain=", "mult1", "mult1=")
149
+ instance.public_methods.map(&:to_s).should include("plain", "plain=", "mult1", "mult1=")
150
150
  end
151
151
 
152
152
  it "should define methods as protected when :visibility => :protected" do
153
- instance.protected_methods.should include("protected_var", "protected_var=")
153
+ instance.protected_methods.map(&:to_s).should include("protected_var", "protected_var=")
154
154
  end
155
155
 
156
156
  it "should define methods as private when :visibility => :private" do
157
- instance.private_methods.should include("private_var", "private_var=")
157
+ instance.private_methods.map(&:to_s).should include("private_var", "private_var=")
158
158
  end
159
159
 
160
160
  it "should define methods as public when :visibility is not provided, even in a private context" do
161
- instance.public_methods.should include("contextually_private_var", "contextually_private_var=")
161
+ instance.public_methods.map(&:to_s).should include("contextually_private_var", "contextually_private_var=")
162
162
  end
163
163
  end
164
164
 
@@ -248,11 +248,11 @@ describe ZeevexThreadsafe::ThreadLocals do
248
248
 
249
249
  [:private_var].each do |key|
250
250
  it "should have defined reader for #{key}" do
251
- instance.private_methods.should include(key.to_s)
251
+ instance.private_methods.map(&:to_s).should include(key.to_s)
252
252
  end
253
253
 
254
254
  it "should have defined writer for #{key}" do
255
- instance.private_methods.should include(key.to_s + "=")
255
+ instance.private_methods.map(&:to_s).should include(key.to_s + "=")
256
256
  end
257
257
  end
258
258
  end
@@ -292,19 +292,19 @@ describe ZeevexThreadsafe::ThreadLocals do
292
292
 
293
293
  context "visibility" do
294
294
  it "should define methods as public by default" do
295
- instance.public_methods.should include("plain", "plain=", "mult1", "mult1=")
295
+ instance.public_methods.map(&:to_s).should include("plain", "plain=", "mult1", "mult1=")
296
296
  end
297
297
 
298
298
  it "should define methods as protected when :visibility => :protected" do
299
- instance.protected_methods.should include("protected_var", "protected_var=")
299
+ instance.protected_methods.map(&:to_s).should include("protected_var", "protected_var=")
300
300
  end
301
301
 
302
302
  it "should define methods as private when :visibility => :private" do
303
- instance.private_methods.should include("private_var", "private_var=")
303
+ instance.private_methods.map(&:to_s).should include("private_var", "private_var=")
304
304
  end
305
305
 
306
306
  it "should define methods as public when :visibility is not provided, even in a private context" do
307
- instance.public_methods.should include("contextually_private_var", "contextually_private_var=")
307
+ instance.public_methods.map(&:to_s).should include("contextually_private_var", "contextually_private_var=")
308
308
  end
309
309
  end
310
310
 
metadata CHANGED
@@ -1,82 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: zeevex_threadsafe
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 0
9
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Robert Sanders
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-05-03 00:00:00 -04:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-10-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: zeevex_proxy
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
30
22
  type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: zeevex_delayed
34
23
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- version: "0"
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: zeevex_delayed
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
42
38
  type: :runtime
43
- version_requirements: *id002
44
- - !ruby/object:Gem::Dependency
45
- name: rspec
46
39
  prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
48
- requirements:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
49
51
  - - ~>
50
- - !ruby/object:Gem::Version
51
- segments:
52
- - 2
53
- - 9
54
- - 0
52
+ - !ruby/object:Gem::Version
55
53
  version: 2.9.0
56
54
  type: :development
57
- version_requirements: *id003
58
- - !ruby/object:Gem::Dependency
59
- name: rake
60
55
  prerelease: false
61
- requirement: &id004 !ruby/object:Gem::Requirement
62
- requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- segments:
66
- - 0
67
- version: "0"
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.9.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
68
70
  type: :development
69
- version_requirements: *id004
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
70
78
  description: Utilities to help in creating thread-safe apps
71
- email:
79
+ email:
72
80
  - robert@zeevex.com
73
81
  executables: []
74
-
75
82
  extensions: []
76
-
77
83
  extra_rdoc_files: []
78
-
79
- files:
84
+ files:
80
85
  - .gitignore
81
86
  - Gemfile
82
87
  - Rakefile
@@ -85,42 +90,40 @@ files:
85
90
  - lib/zeevex_threadsafe/rails.rb
86
91
  - lib/zeevex_threadsafe/rails/request_globals.rb
87
92
  - lib/zeevex_threadsafe/rails/thread_pool_release.rb
93
+ - lib/zeevex_threadsafe/synchronized.rb
88
94
  - lib/zeevex_threadsafe/thread_locals.rb
89
95
  - lib/zeevex_threadsafe/thread_safer.rb
90
96
  - lib/zeevex_threadsafe/version.rb
91
97
  - spec/spec_helper.rb
98
+ - spec/synchronized_spec.rb
92
99
  - spec/thread_locals_spec.rb
93
100
  - zeevex_threadsafe.gemspec
94
- has_rdoc: true
95
101
  homepage: http://github.com/zeevex/zeevex_threadsafe
96
102
  licenses: []
97
-
98
103
  post_install_message:
99
104
  rdoc_options: []
100
-
101
- require_paths:
105
+ require_paths:
102
106
  - lib
103
- required_ruby_version: !ruby/object:Gem::Requirement
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- segments:
108
- - 0
109
- version: "0"
110
- required_rubygems_version: !ruby/object:Gem::Requirement
111
- requirements:
112
- - - ">="
113
- - !ruby/object:Gem::Version
114
- segments:
115
- - 0
116
- version: "0"
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
117
119
  requirements: []
118
-
119
120
  rubyforge_project: zeevex_threadsafe
120
- rubygems_version: 1.3.6
121
+ rubygems_version: 1.8.23
121
122
  signing_key:
122
123
  specification_version: 3
123
124
  summary: Utilities to help in creating thread-safe apps
124
- test_files:
125
+ test_files:
125
126
  - spec/spec_helper.rb
127
+ - spec/synchronized_spec.rb
126
128
  - spec/thread_locals_spec.rb
129
+ has_rdoc: