thread_local_accessor 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,5 +3,7 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
+ - jruby-18mode
7
+ - jruby-19mode
6
8
  script:
7
9
  - bundle exec rake test
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## Thread Local Accessor 0.1.1 (Juni 13, 2012)
4
+
5
+ * Improve implementation (thanks @brainopia for an idea)
6
+
3
7
  ## Thread Local Accessor 0.1.0 (April 18, 2012)
4
8
 
5
9
  * First public release
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ThreadLocalAccessor
2
2
 
3
- Thread local accessor. An idea from [here](http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/).
3
+ Thread local accessor. An idea and big part of code from [here](http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/).
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,24 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ It implement thread-safe class accessor implemented via Thread.current:
22
+
23
+ ``` ruby
24
+ class ThreadedLib
25
+ thread_local_accessor :some_setting, :default => :default
26
+ end
27
+
28
+ instance = ThreadedLib.new
29
+ ThreadedLib.some_setting = 5
30
+
31
+ ThreadedLib.some_setting # => 5
32
+ instance.some_setting # => 5
33
+
34
+ Thread.new {
35
+ ThreadedLib.some_setting # => :default
36
+ instance.some_setting # => :default
37
+ end
38
+ ```
22
39
 
23
40
  ## Status
24
41
 
@@ -3,22 +3,21 @@ require "thread_local_accessor/version"
3
3
  # An idea from http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/
4
4
  class Class
5
5
  def thread_local_accessor name, options = {}
6
- m = Module.new
7
- m.module_eval %{
8
- def #{name}
9
- k = ((Class === self ? self : self.class).object_id.to_s + '_#{name}').to_sym
6
+ m = Module.new do
7
+ define_method "#{name}=" do |value|
8
+ k = (Class === self ? self : self.class).object_id.to_s + "_" + name.to_s
9
+ Thread.current[k] = value
10
+ end
11
+
12
+ define_method name do
13
+ k = (Class === self ? self : self.class).object_id.to_s + "_" + name.to_s
10
14
  if Thread.current.key?(k)
11
15
  Thread.current[k]
12
16
  else
13
- #{options[:default].inspect}
17
+ options[:default]
14
18
  end
15
19
  end
16
-
17
- def #{name}=(val)
18
- k = ((Class === self ? self : self.class).object_id.to_s + '_#{name}').to_sym
19
- Thread.current[k] = val
20
- end
21
- }
20
+ end
22
21
 
23
22
  class_eval do
24
23
  include m
@@ -1,3 +1,3 @@
1
1
  module ThreadLocalAccessor
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -4,6 +4,7 @@ require 'thread_local_accessor'
4
4
  # http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/
5
5
  class ThreadedLib
6
6
  thread_local_accessor :some_setting, :default => :default
7
+ thread_local_accessor :some_proc, :default => Proc.new{|x| x*x}
7
8
  end
8
9
 
9
10
  class TestThreadedClassAttrAccessor < Test::Unit::TestCase
@@ -26,4 +27,26 @@ class TestThreadedClassAttrAccessor < Test::Unit::TestCase
26
27
 
27
28
  assert_equal 5, ThreadedLib.some_setting
28
29
  end
30
+
31
+ def test_with_procs
32
+ instance = ThreadedLib.new
33
+
34
+ ThreadedLib.some_proc = Proc.new{|x| x - 1}
35
+
36
+ assert_equal 9, ThreadedLib.some_proc.call(10)
37
+ assert_equal 9, instance.some_proc.call(10)
38
+
39
+ Thread.new {
40
+ instance.some_proc = Proc.new{|x| x + 1}
41
+
42
+ assert_equal 11, ThreadedLib.some_proc.call(10)
43
+ assert_equal 11, instance.some_proc.call(10)
44
+ }.join
45
+
46
+ Thread.new {
47
+ assert_equal 100, ThreadedLib.some_proc.call(10)
48
+ }.join
49
+
50
+ assert_equal 9, ThreadedLib.some_proc.call(10)
51
+ end
29
52
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thread_local_accessor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-18 00:00:00.000000000 Z
12
+ date: 2012-06-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &79427970 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *79427970
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  description: Thread Local Accessor
26
31
  email:
27
32
  - vakhov@gmail.com
@@ -54,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
59
  version: '0'
55
60
  segments:
56
61
  - 0
57
- hash: -587324531
62
+ hash: 272763085
58
63
  required_rubygems_version: !ruby/object:Gem::Requirement
59
64
  none: false
60
65
  requirements:
@@ -63,10 +68,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
68
  version: '0'
64
69
  segments:
65
70
  - 0
66
- hash: -587324531
71
+ hash: 272763085
67
72
  requirements: []
68
73
  rubyforge_project:
69
- rubygems_version: 1.8.17
74
+ rubygems_version: 1.8.24
70
75
  signing_key:
71
76
  specification_version: 3
72
77
  summary: Thread Safe Local Accessor