barney 0.8.1 → 0.9.0
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/.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
|