thread_variables 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .rvmrc
6
7
  Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # ThreadVariables
2
2
 
3
3
  This gem provides methods to access thread local variables with a ruby trunk compatible
4
- API. It also provides an implementation for ruby 1.9, since ruby 1.9.3 made thread locals
5
- fiber local.
4
+ API. It also provides an implementation of thread local variables for ruby 1.9, since ruby
5
+ 1.9 made thread locals fiber local. This change in semantics can lead to surprising
6
+ results when accessing thread locals from enumerators.
6
7
 
7
8
  See http://bugs.ruby-lang.org/issues/7097
8
9
 
9
-
10
10
  ## Installation
11
11
 
12
12
  Add this line to your application's Gemfile:
@@ -23,12 +23,28 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
+ Basic interface: (this is the native code interface for ruby trunk)
27
+
26
28
  require "thread_variables"
27
29
  Thread.current.thread_variable_set :foo, 5
28
30
  Thread.current.thread_variable_get :foo
29
31
  Thread.current.thread_variable? :foo
30
32
  Thread.current.thread_variables
31
33
 
34
+ Convenience interface: (proxied access to native interface)
35
+
36
+ require "thread_variables/access"
37
+ Thread.current.locals[:foo] = 5
38
+ Thread.current.locals[:foo]
39
+ Thread.current.locals.key?(:foo)
40
+ Thread.current.locals.keys
41
+
42
+ Especially useful for the ||= pattern:
43
+
44
+ Thread.current.locals[:counter] ||= 0
45
+ Thread.current.locals[:counter] += 1
46
+
47
+
32
48
  ## Contributing
33
49
 
34
50
  1. Fork it
@@ -0,0 +1,31 @@
1
+ require "thread_variables"
2
+
3
+ module ThreadVariables
4
+ class AccessProxy < (RUBY_VERSION >= "1.9" ? BasicObject : Object)
5
+ def initialize(thread)
6
+ @thread = thread
7
+ end
8
+
9
+ def [](k)
10
+ @thread.thread_variable_get(k)
11
+ end
12
+
13
+ def []=(k,v)
14
+ @thread.thread_variable_set(k,v)
15
+ end
16
+
17
+ def key?(k)
18
+ @thread.thread_variable?(k)
19
+ end
20
+
21
+ def keys
22
+ @thread.thread_variables
23
+ end
24
+ end
25
+ end
26
+
27
+ class Thread
28
+ def locals
29
+ @thread_variables_access_proxy ||= ThreadVariables::AccessProxy.new(self)
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module ThreadVariables
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,7 +1,12 @@
1
- require 'thread_variables'
2
1
  require 'test/unit'
3
2
  require File.expand_path('../colorized_test_output', __FILE__)
4
3
 
4
+ require 'thread'
5
+ if $NATIVE_THREAD_VARIABLES = Thread.instance_methods.include?(:thread_variables)
6
+ puts ANSI.ansi("\nYou have native thread variables. Hurray!\n", :green)
7
+ end
8
+ require 'thread_variables/access'
9
+
5
10
  class ThreadVariablesTest < Test::Unit::TestCase
6
11
 
7
12
  def test_symbol_setter_and_getter
@@ -125,6 +130,44 @@ class ThreadVariablesTest < Test::Unit::TestCase
125
130
  assert_raises(SecurityError) do
126
131
  Thread.new { $SAFE = 4; t.thread_variable_set(:foo, :baz) }.join
127
132
  end
128
- end if RUBY_VERSION > "1.9.3"
133
+ end if $NATIVE_THREAD_VARIABLES
134
+
135
+ end
136
+
137
+ class ProxyTest < Test::Unit::TestCase
138
+
139
+ def test_proxy_get
140
+ t = Thread.new { Thread.current.thread_variable_set :foo, :lol }
141
+ t.join
142
+ assert_equal :lol, t.locals[:foo]
143
+ end
144
+
145
+ def test_proxy_set
146
+ t = Thread.new { Thread.current.locals[:foo] = :lol }
147
+ t.join
148
+ assert_equal :lol, t.thread_variable_get(:foo)
149
+ end
150
+
151
+ def test_proxy_key
152
+ t = Thread.new { Thread.current.thread_variable_set :foo, :lol }
153
+ t.join
154
+ assert t.locals.key?(:foo)
155
+ end
156
+
157
+ def test_proxy_keys
158
+ t = Thread.new { Thread.current.thread_variable_set :foo, :lol }
159
+ t.join
160
+ assert_equal [:foo], t.locals.keys
161
+ end
162
+
163
+ def test_or_equals_pattern
164
+ t = Thread.new do
165
+ locals = Thread.current.locals
166
+ locals[:counter] ||= 1
167
+ locals[:counter] += 1
168
+ end
169
+ t.join
170
+ assert_equal 2, t.thread_variable_get(:counter)
171
+ end
129
172
 
130
173
  end
metadata CHANGED
@@ -1,77 +1,66 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: thread_variables
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Stefan Kaes
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-11-02 00:00:00 Z
12
+ date: 2012-11-03 00:00:00.000000000 Z
19
13
  dependencies: []
20
-
21
14
  description: Provide thread local variables for ruby 1.9 and API for all ruby versions
22
- email:
15
+ email:
23
16
  - stefan.kaes@xing.com
24
17
  executables: []
25
-
26
18
  extensions: []
27
-
28
19
  extra_rdoc_files: []
29
-
30
- files:
20
+ files:
31
21
  - .gitignore
32
22
  - Gemfile
33
23
  - LICENSE.txt
34
24
  - README.md
35
25
  - Rakefile
36
26
  - lib/thread_variables.rb
27
+ - lib/thread_variables/access.rb
37
28
  - lib/thread_variables/version.rb
38
29
  - test/colorized_test_output.rb
39
30
  - test/thread_variables_test.rb
40
31
  - thread_variables.gemspec
41
32
  - thread_variables.patch
42
- homepage: ""
33
+ homepage: ''
43
34
  licenses: []
44
-
45
35
  post_install_message:
46
36
  rdoc_options: []
47
-
48
- require_paths:
37
+ require_paths:
49
38
  - lib
50
- required_ruby_version: !ruby/object:Gem::Requirement
39
+ required_ruby_version: !ruby/object:Gem::Requirement
51
40
  none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- hash: 3
56
- segments:
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ segments:
57
46
  - 0
58
- version: "0"
59
- required_rubygems_version: !ruby/object:Gem::Requirement
47
+ hash: -1903362225607811994
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
49
  none: false
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- hash: 3
65
- segments:
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ segments:
66
55
  - 0
67
- version: "0"
56
+ hash: -1903362225607811994
68
57
  requirements: []
69
-
70
58
  rubyforge_project:
71
59
  rubygems_version: 1.8.24
72
60
  signing_key:
73
61
  specification_version: 3
74
- summary: Provide functionality compatible to latest trunk commit for all ruby version above 1.8
75
- test_files:
62
+ summary: Provide functionality compatible to latest trunk commit for all ruby version
63
+ above 1.8
64
+ test_files:
76
65
  - test/colorized_test_output.rb
77
66
  - test/thread_variables_test.rb