barney 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -0
- data/ChangeLog +14 -46
- data/README.md +2 -4
- data/lib/barney/share.rb +36 -38
- data/lib/barney.rb +1 -1
- data/test/suite/lib/barney/share#synchronize.rb +10 -0
- data/test/suite/lib/barney/share#unshare.rb +2 -2
- metadata +2 -2
data/.yardopts
CHANGED
data/ChangeLog
CHANGED
@@ -1,51 +1,19 @@
|
|
1
|
-
2011-04-
|
1
|
+
2011-04-21 Robert Gleeson <rob@flowof.info>
|
2
2
|
|
3
|
-
*
|
4
|
-
|
3
|
+
* ChangeLog:
|
4
|
+
Change to GNU ChangeLog format.
|
5
5
|
|
6
|
-
|
6
|
+
* lib/barney/share.rb:
|
7
|
+
Don't lazy-delete objects from @streams.
|
8
|
+
Objects are removed from @streams during a call to #unshare now.
|
9
|
+
* lib/barney/share.rb:
|
10
|
+
Add the member 'variable' to StreamPair.
|
11
|
+
* lib/barney/share.rb:
|
12
|
+
Remove @shared.
|
13
|
+
Replaced by @streams, an Array of StreamPair objects.
|
14
|
+
|
15
|
+
|
7
16
|
|
8
|
-
* Remove "seq" attribute from StreamPair.
|
9
|
-
* Banish @seq.
|
10
|
-
* Add HistoryItem (subclass of Struct).
|
11
|
-
* Share#history returns an Array of HistoryItem objects.
|
12
|
-
* Share#shared is deprecated. Use Shared#variables instead.
|
13
17
|
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
* Barney::Share#initialize yields a block.
|
18
|
-
|
19
|
-
2011-03-04 Robert Gleeson <rob@flowof.info> v0.6.0
|
20
|
-
|
21
|
-
* Store instances of StreamPair in an array.
|
22
|
-
* Store sequence and pipe objects in a Struct referenced by StreamPair.
|
23
|
-
|
24
|
-
2011-03-04 Robert Gleeson <rob@flowof.info> v0.5.0
|
25
|
-
|
26
|
-
* Solve Github Issue no. 3
|
27
|
-
* Solve Github Issue no. 2
|
28
|
-
* Write a more efficient and easier to understand Barney::Share#sync method.
|
29
|
-
|
30
|
-
2011-02-16 Robert Gleeson <rob@flowof.info> v0.4.1
|
31
|
-
|
32
|
-
* Add http://www.gem-testers.org support.
|
33
|
-
* Rewrite test suite using 'minitest'.
|
34
|
-
|
35
|
-
2011-02-12 Robert Gleeson <rob@flowof.info> v0.4.0
|
36
|
-
|
37
|
-
* Add Barney::Share#history.
|
38
|
-
|
39
|
-
2011-01-16 Robert Gleeson <rob@flowof.info> v0.3.1
|
40
|
-
|
41
|
-
* Solve Github Issue no. 1.
|
42
|
-
* Add Barney::Share#pid.
|
43
|
-
|
44
|
-
2011-01-04 Robert Gleeson <rob@flowof.info> v0.2.0
|
45
|
-
|
46
|
-
* Alias #synchronize as #sync.
|
47
|
-
|
48
|
-
2011-01-03 Robert Gleeson <rob@flowof.info> v0.2.0
|
49
|
-
|
50
|
-
* Add Barney::Share#unshare.
|
51
|
-
* Add Barney::Share#shared.
|
19
|
+
|
data/README.md
CHANGED
@@ -26,7 +26,6 @@ Okay, now that we've got that out of the way, let's see what using Barney is lik
|
|
26
26
|
#!/usr/bin/env ruby
|
27
27
|
require 'barney'
|
28
28
|
|
29
|
-
|
30
29
|
obj = Barney::Share.new
|
31
30
|
obj.share :message
|
32
31
|
message = 'Hello, '
|
@@ -60,14 +59,13 @@ I'm following the [Semantic Versioning](http://www.semver.org) policy.
|
|
60
59
|
|
61
60
|
**API**
|
62
61
|
|
63
|
-
* [master (git)](http://rubydoc.info/github/robgleeson/
|
62
|
+
* [master (git)](http://rubydoc.info/github/robgleeson/barney/master/)
|
63
|
+
* [0.9.0](http://rubydoc.info/gems/barney/0.9.0/)
|
64
64
|
* [0.8.1](http://rubydoc.info/gems/barney/0.8.1/)
|
65
65
|
* [0.8.0](http://rubydoc.info/gems/barney/0.8.0/)
|
66
66
|
* [0.7.0](http://rubydoc.info/gems/barney/0.7.0)
|
67
67
|
* [0.6.0](http://rubydoc.info/gems/barney/0.6.0)
|
68
68
|
* [0.5.0](http://rubydoc.info/gems/barney/0.5.0)
|
69
|
-
* [0.4.1](http://rubydoc.info/gems/barney/0.4.1)
|
70
|
-
* [0.4.0](http://rubydoc.info/gems/barney/0.4.0)
|
71
69
|
* …
|
72
70
|
|
73
71
|
|
data/lib/barney/share.rb
CHANGED
@@ -2,10 +2,11 @@ module Barney
|
|
2
2
|
|
3
3
|
class Share
|
4
4
|
|
5
|
-
# @attr [
|
6
|
-
# @attr [IO]
|
5
|
+
# @attr [Symbol] variable The name of the variable associated with _in_, and _out_.
|
6
|
+
# @attr [IO] in The pipe which is used to read data.
|
7
|
+
# @attr [IO] out The pipe which is used to write data.
|
7
8
|
# @api private
|
8
|
-
StreamPair = Struct.new :in, :out
|
9
|
+
StreamPair = Struct.new :variable, :in, :out
|
9
10
|
|
10
11
|
# @attr [Symbol] variable The variable name.
|
11
12
|
# @attr [Object] value The value of the variable.
|
@@ -14,12 +15,12 @@ module Barney
|
|
14
15
|
@mutex = Mutex.new
|
15
16
|
|
16
17
|
class << self
|
17
|
-
# Returns the
|
18
|
+
# Returns the last value read from a spawned child process.
|
18
19
|
# @api private
|
19
20
|
# @return [Object]
|
20
21
|
attr_accessor :value
|
21
22
|
|
22
|
-
# Returns a Mutex that is used
|
23
|
+
# Returns a Mutex that is used by the {Barney::Share#sync} method.
|
23
24
|
# @api private
|
24
25
|
# @return [Mutex]
|
25
26
|
attr_reader :mutex
|
@@ -33,55 +34,55 @@ module Barney
|
|
33
34
|
# @return [Fixnum]
|
34
35
|
attr_reader :pid
|
35
36
|
|
37
|
+
# Returns an Array of {HistoryItem} objects.
|
38
|
+
# @see HistoryItem
|
36
39
|
# @return [Array<HistoryItem>]
|
37
40
|
attr_reader :history
|
38
41
|
|
39
42
|
# @yieldparam [Barney::Share] self Yields an instance of {Barney::Share}.
|
40
43
|
# @return [Barney::Share]
|
41
44
|
def initialize
|
42
|
-
@
|
45
|
+
@streams = []
|
43
46
|
@variables = []
|
44
47
|
@history = []
|
45
48
|
@context = nil
|
46
49
|
yield self if block_given?
|
47
50
|
end
|
48
51
|
|
49
|
-
#
|
50
|
-
# @param [Symbol] Variable Accepts
|
52
|
+
# Marks a variable or constant to be shared between two processes.
|
53
|
+
# @param [Symbol] Variable Accepts the name(s) of the variables or constants you want to share.
|
51
54
|
# @return [Array<Symbol>] Returns a list of all variables that are being shared.
|
52
55
|
def share *variables
|
53
56
|
@variables.push *variables.map(&:to_sym)
|
54
57
|
@variables.uniq!
|
55
58
|
end
|
56
59
|
|
57
|
-
#
|
58
|
-
# @param [Symbol] Variable Accepts
|
60
|
+
# Removes a variable or constant from being shared between two processes.
|
61
|
+
# @param [Symbol] Variable Accepts the name(s) of the variables or constants you want to stop sharing.
|
59
62
|
# @return [Array<Symbol>] Returns a list of the variables that are still being shared.
|
60
63
|
def unshare *variables
|
61
|
-
variables.map(&:to_sym).each
|
64
|
+
variables.map(&:to_sym).each do |variable|
|
65
|
+
@streams.delete_if { |stream| stream.variable == variable }
|
66
|
+
@variables.delete variable
|
67
|
+
end
|
62
68
|
@variables
|
63
69
|
end
|
64
70
|
|
65
|
-
#
|
71
|
+
# Spawns a child process.
|
66
72
|
# It can be treated like the Kernel.fork method, but a block or Proc object is a required argument.
|
67
|
-
# @param [Proc] Proc Accepts a block or Proc object that will be executed in a child
|
68
|
-
#
|
69
|
-
#
|
70
|
-
# @raise [ArgumentError] It will raise an ArgumentError if a block or Proc object isn't
|
71
|
-
# supplied as an argument.
|
72
|
-
#
|
73
|
+
# @param [Proc] Proc Accepts a block or Proc object that will be executed in a child process.
|
74
|
+
# @raise [ArgumentError] Raises an ArgumentError if a block or Proc object isn't supplied.
|
73
75
|
# @return [Fixnum] Returns the Process ID(PID) of the spawned child process.
|
74
76
|
def fork &blk
|
75
77
|
raise ArgumentError, "A block or Proc object is expected" unless block_given?
|
76
78
|
spawn_pipes
|
77
79
|
|
78
80
|
@context = blk.binding
|
79
|
-
@pid
|
81
|
+
@pid = Kernel.fork do
|
80
82
|
blk.call
|
81
|
-
@
|
82
|
-
stream = history[-1]
|
83
|
+
@streams.each do |stream|
|
83
84
|
stream.in.close
|
84
|
-
stream.out.write Marshal.dump(eval("#{variable}", @context))
|
85
|
+
stream.out.write Marshal.dump(eval("#{stream.variable}", @context))
|
85
86
|
stream.out.close
|
86
87
|
end
|
87
88
|
end
|
@@ -89,33 +90,30 @@ module Barney
|
|
89
90
|
@pid
|
90
91
|
end
|
91
92
|
|
92
|
-
#
|
93
|
-
# It will block until the spawned child process has exited.
|
93
|
+
# Synchronizes data between the parent and child process.
|
94
|
+
# It will block until the spawned child process has exited.
|
94
95
|
# @return [void]
|
95
96
|
def synchronize
|
96
97
|
Barney::Share.mutex.synchronize do
|
97
|
-
@
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
@history.push HistoryItem.new variable, value
|
104
|
-
end
|
98
|
+
@streams.each do |stream|
|
99
|
+
stream.out.close
|
100
|
+
Barney::Share.value = Marshal.load stream.in.read
|
101
|
+
stream.in.close
|
102
|
+
value = eval "#{stream.variable} = Barney::Share.value", @context
|
103
|
+
@history.push HistoryItem.new(stream.variable, value)
|
105
104
|
end
|
105
|
+
@streams.clear
|
106
106
|
end
|
107
107
|
end
|
108
108
|
alias_method :sync, :synchronize
|
109
109
|
|
110
110
|
private
|
111
111
|
|
112
|
+
# Manages the creation of pipes used for cross-process communcation.
|
113
|
+
# @api private
|
112
114
|
def spawn_pipes
|
113
|
-
@
|
114
|
-
@
|
115
|
-
end
|
116
|
-
|
117
|
-
@variables.each do |variable|
|
118
|
-
@shared[variable].push StreamPair.new *IO.pipe
|
115
|
+
@variables.each do |variable|
|
116
|
+
@streams.push StreamPair.new(variable, *IO.pipe)
|
119
117
|
end
|
120
118
|
end
|
121
119
|
|
data/lib/barney.rb
CHANGED
@@ -90,6 +90,16 @@ describe Barney::Share do
|
|
90
90
|
assert_equal 5, @instance.history[1].value
|
91
91
|
end
|
92
92
|
|
93
|
+
it 'should assert a IOError (Closed Stream) is not raised.' do
|
94
|
+
x = 5
|
95
|
+
pids = []
|
96
|
+
@instance.share :x
|
97
|
+
pids << @instance.fork { }
|
98
|
+
@instance.sync
|
99
|
+
pids << @instance.fork { }
|
100
|
+
pids.each { |pid| Process.wait pid }
|
101
|
+
end
|
102
|
+
|
93
103
|
end
|
94
104
|
|
95
105
|
end
|
@@ -31,11 +31,11 @@ describe Barney::Share do
|
|
31
31
|
x = 5
|
32
32
|
@instance.share :x
|
33
33
|
@instance.fork { }
|
34
|
-
assert true, @instance.instance_variable_get(:@
|
34
|
+
assert true, @instance.instance_variable_get(:@streams).first.variable == :x
|
35
35
|
|
36
36
|
@instance.unshare :x
|
37
37
|
@instance.fork { }
|
38
|
-
|
38
|
+
assert_equal true, @instance.instance_variable_get(:@streams).empty?
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: barney
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.9.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Robert Gleeson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-21 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|