thread-parent 1.0.1 → 1.0.2
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.
- data/.travis.yml +1 -0
- data/README.md +22 -22
- data/lib/thread_parent.rb +32 -10
- data/lib/thread_parent/version.rb +1 -1
- data/test/test_thread_parent.rb +10 -7
- data/thread-parent.gemspec +2 -0
- metadata +14 -3
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -19,46 +19,46 @@ Or install it yourself as:
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
|
22
|
+
Thread is extended to provide direct access to its 'parent', or the thread where the current
|
23
|
+
thread was created. It also provides a way to lookup through its ancestor chain for Thread-local variables.
|
23
24
|
|
24
25
|
```ruby
|
25
|
-
require '
|
26
|
+
require 'thread_parent'
|
26
27
|
|
27
28
|
Thread.current[:abc] = 'abc'
|
28
29
|
|
29
|
-
|
30
|
+
Thread.new do |thread|
|
30
31
|
|
31
|
-
thread.parent == Thread.main
|
32
|
+
thread.parent == Thread.main #=> true
|
32
33
|
|
33
|
-
#
|
34
|
-
|
34
|
+
# Standard local variable lookup behaves as expected.
|
35
|
+
thread[:abc] #=> nil
|
35
36
|
|
36
|
-
#
|
37
|
-
|
37
|
+
# Lookup through the ancestor chain is now supported.
|
38
|
+
thread.parents[:abc] #=> 'abc'
|
38
39
|
|
39
|
-
|
40
|
-
|
40
|
+
# Local thread variable assignments works as expected.
|
41
|
+
thread[:def] = 'def'
|
42
|
+
thread[:def] #=> 'def'
|
43
|
+
thread.parents[:def] #=> 'def' <- The calling thread is always checked first.
|
41
44
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
```
|
45
|
+
# Short-hand references to the current thread's parents is also provided.
|
46
|
+
Thread.parents[:abc] #=> 'abc'
|
47
|
+
Thread.parent == Thread.main #=> true
|
47
48
|
|
48
|
-
|
49
|
+
Thread.new do
|
50
|
+
Thread.parents[:def] #= 'def'
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
Thread.new do
|
55
|
-
# This is really a ThreadParent::Thread
|
52
|
+
# The parent lookup will continue to the parent's parent until a variable is found.
|
53
|
+
Thread.parents[:abc] #= 'abc'
|
54
|
+
end
|
56
55
|
end
|
57
56
|
```
|
58
57
|
|
59
58
|
## Code Status
|
60
59
|
|
61
60
|
[](http://travis-ci.org/mje113/thread-parent)
|
61
|
+
[](https://codeclimate.com/github/mje113/thread-parent)
|
62
62
|
|
63
63
|
## Contributing
|
64
64
|
|
data/lib/thread_parent.rb
CHANGED
@@ -2,23 +2,45 @@ require 'thread_parent/version'
|
|
2
2
|
require 'thread'
|
3
3
|
|
4
4
|
module ThreadParent
|
5
|
-
class Thread < Thread
|
6
5
|
|
7
|
-
|
8
|
-
@_parent = Thread.current
|
9
|
-
super
|
10
|
-
end
|
6
|
+
class Parents
|
11
7
|
|
12
|
-
def
|
13
|
-
@
|
8
|
+
def initialize(child)
|
9
|
+
@child = child
|
14
10
|
end
|
15
11
|
|
16
12
|
def [](key)
|
17
|
-
if key?(key)
|
18
|
-
|
13
|
+
if @child.key?(key)
|
14
|
+
@child[key]
|
19
15
|
else
|
20
|
-
parent[key]
|
16
|
+
@child.parent.parents[key]
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
21
|
+
|
22
|
+
class Thread
|
23
|
+
|
24
|
+
alias_method :_initialize, :initialize
|
25
|
+
|
26
|
+
def initialize(*args, &block)
|
27
|
+
@_parent = Thread.current
|
28
|
+
_initialize(*args, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def parent
|
32
|
+
@_parent
|
33
|
+
end
|
34
|
+
|
35
|
+
def parents
|
36
|
+
ThreadParent::Parents.new(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.parent
|
40
|
+
Thread.current.parent
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.parents
|
44
|
+
ThreadParent::Parents.new(Thread.current)
|
45
|
+
end
|
46
|
+
end
|
data/test/test_thread_parent.rb
CHANGED
@@ -2,12 +2,15 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestThreadParent < MiniTest::Unit::TestCase
|
4
4
|
|
5
|
-
include ThreadParent
|
6
|
-
|
7
5
|
def setup
|
8
6
|
Thread.current[:a] = 'a'
|
9
7
|
end
|
10
8
|
|
9
|
+
def test_is_a_thread_parent
|
10
|
+
thread = Thread.new { 'work' }
|
11
|
+
assert_kind_of Thread, thread
|
12
|
+
end
|
13
|
+
|
11
14
|
def test_can_have_parent
|
12
15
|
thread = Thread.new { 'work' }.join
|
13
16
|
assert_equal Thread.current, thread.parent
|
@@ -15,13 +18,13 @@ class TestThreadParent < MiniTest::Unit::TestCase
|
|
15
18
|
|
16
19
|
def test_can_find_thread_variable_in_parent
|
17
20
|
thread = Thread.new { 'work' }.join
|
18
|
-
assert_equal 'a', thread[:a]
|
21
|
+
assert_equal 'a', thread.parents[:a]
|
19
22
|
end
|
20
23
|
|
21
24
|
def test_can_find_thread_variable_in_parents_parent
|
22
25
|
Thread.new {
|
23
26
|
Thread.new {
|
24
|
-
assert_equal 'a', Thread.current[:a]
|
27
|
+
assert_equal 'a', Thread.current.parents[:a]
|
25
28
|
}.join
|
26
29
|
}.join
|
27
30
|
end
|
@@ -31,12 +34,12 @@ class TestThreadParent < MiniTest::Unit::TestCase
|
|
31
34
|
Thread.current[:a] = 'b'
|
32
35
|
}.join
|
33
36
|
|
34
|
-
assert_equal 'b', thread[:a]
|
37
|
+
assert_equal 'b', thread.parents[:a]
|
35
38
|
end
|
36
39
|
|
37
40
|
def test_wont_break_parent_threads_scope
|
38
41
|
Thread.new { Thread.current[:a] = 'b' }.join
|
39
42
|
thread = Thread.new { 'work' }.join
|
40
|
-
assert_equal('a', thread[:a])
|
43
|
+
assert_equal('a', thread.parents[:a])
|
41
44
|
end
|
42
|
-
end
|
45
|
+
end
|
data/thread-parent.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thread-parent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,19 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
-
dependencies:
|
12
|
+
date: 2013-05-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70120867349120 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70120867349120
|
14
25
|
description: ThreadParent facilitates spawning threads that maintain a reference to
|
15
26
|
the thread that created them. The primary goal is to allow thread local variable
|
16
27
|
lookup through the ancestor chain.
|