eldritch 1.1.0 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dcbd51f156e97fa93b15dbf1ea64470460156f92
4
- data.tar.gz: 6a4463349a3a657c8d528ea74a64d88f8321667a
3
+ metadata.gz: b580cd9181ade4f4a2a6976341a88b3059ad5670
4
+ data.tar.gz: a9947d828dfd477bccbed94f5713c1620de2063e
5
5
  SHA512:
6
- metadata.gz: 911a4fcdac54808756205139c1256c8b63dccd8bcab7c82df3bf27db03c41f3d91df673213b2c200d127516c8c75ff7fbe71f2449e507094032fffa77dc68de5
7
- data.tar.gz: b95e77b84bc0458692fb09a150c1bba0c007f7971abfb0fb163b9383077a4704ab304eea5ea6ac1cdd2229913d859a0dba824e6c9ef19cb102e0d6961f2eba44
6
+ metadata.gz: f336489e6ef818dc9dc92a02b90d94c9b2aa9fb389286f0b80ecaa75ab800c183754bfa43eb2237e2e4c30c229d04e8af354f5dd1a228f61a74a1498847ded4a
7
+ data.tar.gz: 370a2d8c641f8fda77846fec17ce8e6c7dc0dcc0825952c900e0bbb625dd71e999b64af70ae86453399d8d5936832c96de699cedfe7da992e8f59b61bdc3bb05
data/README.md CHANGED
@@ -12,6 +12,27 @@ Code quality
12
12
  [![Coverage Status](http://coveralls.io/repos/beraboris/eldritch/badge.png)](http://coveralls.io/r/beraboris/eldritch)
13
13
  [![Code Climate](http://codeclimate.com/github/beraboris/eldritch.png)](http://codeclimate.com/github/beraboris/eldritch)
14
14
 
15
+ Usage
16
+ -----
17
+
18
+ 1. Install it `gem install eldritch`
19
+ 2. Require it `require 'eldritch'`
20
+ 3. Use it (see features below)
21
+
22
+ By default eldritch will inject the DSL into the global scope. If you don't want this, you can require `eldritch/safe`
23
+ instead of `eldritch`.
24
+
25
+ ```ruby
26
+ require 'eldricth/safe'
27
+
28
+ class MyClass
29
+ include Eldritch::DSL
30
+ extend Eldritch::DSL
31
+
32
+ # The DSL is available in this class
33
+ end
34
+ ```
35
+
15
36
  Features
16
37
  --------
17
38
 
@@ -28,12 +49,10 @@ async def send_email(email)
28
49
  # ...
29
50
  end
30
51
 
31
- # ...
32
52
  send_email(some_email) # runs in the background
33
- # ...
34
53
  ```
35
54
 
36
- #### ruby 1.9.3 and ruby 2.0.0
55
+ #### ruby 1.9.3 and 2.0.0
37
56
 
38
57
  For all versions of ruby before 2.1.0, you need to define async methods like so:
39
58
 
@@ -54,17 +73,14 @@ Async blocks are run concurrently.
54
73
  ```ruby
55
74
  require 'eldritch'
56
75
 
57
- # do some work
58
76
  async do
59
- # some long running task ...
77
+ # runs in the background
60
78
  end
61
- # continue working
62
79
  ```
63
80
 
64
81
  ### tasks
65
82
 
66
- Async blocks and async methods both return tasks. These can be used to interact with the async block/method. As of now,
67
- you can wait for the task to finish or you can get its return value.
83
+ Async blocks and async methods both return tasks. These can be used to interact with the async block/method.
68
84
 
69
85
  ```ruby
70
86
  require 'eldritch'
@@ -73,9 +89,7 @@ task = async do
73
89
  # calculate something that will take a long time
74
90
  end
75
91
 
76
- # ...
77
-
78
- # now we need to result of the task
92
+ # we need to result of the task
79
93
  res = 2 + task.value # waits for the task to finish
80
94
  ```
81
95
 
@@ -135,20 +149,5 @@ this repository you need to add `lib/` to the include path.
135
149
  $ ruby -Ilib examples/the_example.rb
136
150
 
137
151
  Be aware that if you are running ruby < 2.1.0, some the examples may not work. All the examples that define async
138
- methods with `async def something; end` will not work. This is because since ruby 2.1.0 def returns the name of the
152
+ methods with `async def something; end` will not work. This is because, since ruby 2.1.0, def returns the name of the
139
153
  method defined as a symbol.
140
-
141
- Installation
142
- ------------
143
-
144
- Add this line to your application's Gemfile:
145
-
146
- gem 'eldritch'
147
-
148
- And then execute:
149
-
150
- $ bundle
151
-
152
- Or install it yourself as:
153
-
154
- $ gem install eldritch
@@ -87,17 +87,18 @@ module Eldritch
87
87
 
88
88
  yield group
89
89
 
90
- group.wait_all
90
+ group.join_all
91
91
  Thread.current.eldritch_group = old
92
92
  end
93
93
 
94
94
  private
95
95
 
96
96
  def async_block(&block)
97
- task = Task.new do |t|
97
+ task = Task.new do
98
98
  begin
99
- t.value = block.call
99
+ block.call
100
100
  rescue InterruptedError
101
+ # exit silently
101
102
  end
102
103
  end
103
104
  Thread.current.eldritch_group << task
@@ -34,8 +34,8 @@ module Eldritch
34
34
  @mutex.synchronize { block.call }
35
35
  end
36
36
 
37
- def wait_all
38
- @tasks.each {|t| t.wait}
37
+ def join_all
38
+ @tasks.each &:join
39
39
  end
40
40
 
41
41
  # Aborts the other async calls/blocks in the group
@@ -1,8 +1,6 @@
1
1
  module Eldritch
2
2
  # Runs a block in parallel and allows for interaction with said block
3
3
  class Task
4
- attr_writer :value
5
-
6
4
  # @return [Thread] underlying ruby thread
7
5
  attr_reader :thread
8
6
 
@@ -24,14 +22,14 @@ module Eldritch
24
22
  # end
25
23
  # task.start # calls the block in parallel
26
24
  def start
27
- @thread = Thread.new self, &@block
25
+ @thread = Thread.new &@block
28
26
  @thread.eldritch_task = self
29
27
  end
30
28
 
31
29
  # Waits for the task to complete
32
- def wait
30
+ def join
33
31
  @thread.join
34
- @thread.eldritch_task = nil
32
+ unset_thread_task
35
33
  end
36
34
 
37
35
  # The return value of the task
@@ -40,8 +38,9 @@ module Eldritch
40
38
  #
41
39
  # @return whatever the block returns
42
40
  def value
43
- wait
44
- @value
41
+ val = @thread.value
42
+ unset_thread_task
43
+ val
45
44
  end
46
45
 
47
46
  # Forces the task to end
@@ -49,6 +48,7 @@ module Eldritch
49
48
  # This kills the underlying thread. This is a dangerous call.
50
49
  def abort
51
50
  @thread.kill
51
+ unset_thread_task
52
52
  end
53
53
 
54
54
  # Interrupts the task
@@ -59,6 +59,13 @@ module Eldritch
59
59
  # You can still handle the exception yourself.
60
60
  def interrupt
61
61
  @thread.raise InterruptedError.new
62
+ unset_thread_task
63
+ end
64
+
65
+ private
66
+
67
+ def unset_thread_task
68
+ @thread.eldritch_task = nil
62
69
  end
63
70
  end
64
71
  end
@@ -1,3 +1,3 @@
1
1
  module Eldritch
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
@@ -35,11 +35,11 @@ describe Eldritch::DSL do
35
35
  klass.together {}
36
36
  end
37
37
 
38
- it 'should wait on all tasks' do
38
+ it 'should join on all tasks' do
39
39
  group = double('group').as_null_object
40
40
  allow(Eldritch::Group).to receive(:new).and_return(group)
41
41
 
42
- expect(group).to receive(:wait_all)
42
+ expect(group).to receive(:join_all)
43
43
 
44
44
  klass.together {}
45
45
  end
@@ -92,12 +92,6 @@ describe Eldritch::DSL do
92
92
  expect(klass.async {}).to eql(task)
93
93
  end
94
94
 
95
- it 'should set the task value' do
96
- expect(task).to receive(:value=).with('something')
97
-
98
- klass.async { 'something' }
99
- end
100
-
101
95
  it 'should eat any interrupted errors' do
102
96
  block = proc { raise Eldritch::InterruptedError }
103
97
 
@@ -144,18 +138,6 @@ describe Eldritch::DSL do
144
138
 
145
139
  instance.foo(1,2,3)
146
140
  end
147
-
148
- it 'should set the task value' do
149
- expect(task).to receive(:value=).with(42)
150
-
151
- klass.class_eval do
152
- def foo; 42; end
153
- async :foo
154
- end
155
- instance = klass.new
156
-
157
- instance.foo
158
- end
159
141
  end
160
142
  end
161
143
  end
@@ -66,15 +66,15 @@ describe Eldritch::Group do
66
66
  end
67
67
  end
68
68
 
69
- describe '#wait_all' do
70
- it 'should call wait on all tasks' do
69
+ describe '#join_all' do
70
+ it 'should call join on all tasks' do
71
71
  task = double('task')
72
72
  allow(task).to receive(:start)
73
73
  group << task
74
74
 
75
- expect(task).to receive(:wait)
75
+ expect(task).to receive(:join)
76
76
 
77
- group.wait_all
77
+ group.join_all
78
78
  end
79
79
  end
80
80
 
@@ -27,7 +27,7 @@ describe Eldritch::Task do
27
27
  end
28
28
 
29
29
  it 'should start a thread' do
30
- expect(Thread).to receive(:new).with(task)
30
+ expect(Thread).to receive(:new)
31
31
 
32
32
  task.start
33
33
  end
@@ -39,45 +39,51 @@ describe Eldritch::Task do
39
39
  end
40
40
  end
41
41
 
42
- describe '#wait' do
42
+ describe '#join' do
43
43
  it 'should join the thread' do
44
44
  task.start
45
45
 
46
46
  expect(task.thread).to receive(:join)
47
- task.wait
47
+ task.join
48
48
  end
49
49
 
50
50
  it 'should set the thread task to nil' do
51
51
  task.start
52
52
 
53
53
  expect(thread).to receive(:eldritch_task=).with(nil)
54
- task.wait
54
+ task.join
55
55
  end
56
56
  end
57
57
 
58
58
  describe '#value' do
59
- it 'should join the thread' do
59
+ it 'should set the thread task to nil' do
60
60
  task.start
61
61
 
62
- expect(task.thread).to receive(:join)
62
+ expect(thread).to receive(:eldritch_task=).with(nil)
63
63
  task.value
64
64
  end
65
65
 
66
- it 'should set the thread task to nil' do
66
+ it 'should call Thread#value' do
67
67
  task.start
68
-
69
- expect(thread).to receive(:eldritch_task=).with(nil)
68
+ expect(thread).to receive(:value)
70
69
  task.value
71
70
  end
72
71
 
73
- it 'should return the value' do
74
- task.value = 42
72
+ it 'should return what Thread#value returns' do
75
73
  task.start
74
+ allow(thread).to receive(:value).and_return(42)
76
75
  expect(task.value).to eql(42)
77
76
  end
78
77
  end
79
78
 
80
79
  describe '#abort' do
80
+ it 'should set the thread task to nil' do
81
+ task.start
82
+ expect(thread).to receive(:eldritch_task=).with(nil)
83
+
84
+ task.abort
85
+ end
86
+
81
87
  it 'should kill the thread' do
82
88
  expect(thread).to receive(:kill)
83
89
 
@@ -87,6 +93,13 @@ describe Eldritch::Task do
87
93
  end
88
94
 
89
95
  describe '#interrupt' do
96
+ it 'should set the thread task to nil' do
97
+ task.start
98
+ expect(thread).to receive(:eldritch_task=).with(nil)
99
+
100
+ task.interrupt
101
+ end
102
+
90
103
  it 'should raise an interrupted error on the thread' do
91
104
  expect(thread).to receive(:raise).with(kind_of(Eldritch::InterruptedError))
92
105
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eldritch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Bera
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-27 00:00:00.000000000 Z
12
+ date: 2014-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler