barney 0.15.1 → 0.16.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/.gitignore +7 -0
- data/.travis.yml +10 -0
- data/.yardopts +1 -1
- data/ChangeLog +59 -1
- data/Gemfile +3 -0
- data/LICENSE.txt +20 -0
- data/README.md +42 -17
- data/Rakefile +1 -7
- data/barney.gemspec +25 -0
- data/lib/barney.rb +5 -41
- data/lib/barney/core_ext/barney.rb +31 -0
- data/lib/barney/{jobs.rb → core_ext/jobs.rb} +7 -9
- data/lib/barney/methodlookup.rb +61 -0
- data/lib/barney/share.rb +12 -26
- data/samples/barney_method_sample.rb +22 -0
- data/samples/jobs_method_sample.rb +6 -0
- data/test/helpers/methodscopetest.rb +20 -0
- data/test/helpers/selfscopetest.rb +16 -0
- data/test/setup.rb +7 -0
- data/test/suite/lib/barney/core_ext/barney.rb +84 -0
- data/test/suite/lib/barney/core_ext/jobs.rb +20 -0
- data/test/suite/lib/barney/share#fork.rb +2 -2
- data/test/suite/misc/warnings.rb +8 -0
- metadata +28 -14
- data/LICENSE +0 -20
- data/lib/barney/emptystate.rb +0 -26
- data/samples/Barney_method.rb +0 -17
- data/test/suite/lib/barney.rb +0 -26
- data/test/suite/lib/barney/jobs.rb +0 -9
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/.yardopts
CHANGED
data/ChangeLog
CHANGED
@@ -1,10 +1,68 @@
|
|
1
|
+
|
2
|
+
2011-06-29 Robert Gleeson <rob@flowof.info>
|
3
|
+
|
4
|
+
* lib/barney.rb:
|
5
|
+
Release 0.16.0
|
6
|
+
|
7
|
+
* test/suite/warnings.rb test/setup.rb:
|
8
|
+
Assert warnings will not be emitted.
|
9
|
+
|
10
|
+
* lib/barney/share.rb lib/barney/methodlookup.rb lib/barney/core_ext/barney.rb:
|
11
|
+
Don't emit warnings in -W2 mode.
|
12
|
+
|
13
|
+
* lib/barney/share.rb:
|
14
|
+
Rename Thread.current[:'__BARNEY__'] to Thread.current[:BARNEY_SERIALIZED_OBJECT]
|
15
|
+
|
16
|
+
2011-06-26 Robert Gleeson <rob@flowof.info>
|
17
|
+
|
18
|
+
* lib/barney/methodlookup.rb:
|
19
|
+
Raise a NameError if @__barney__ is defined in the calling scope of passed block.
|
20
|
+
|
21
|
+
2011-06-18 Robert Gleeson <rob@flowof.info>
|
22
|
+
|
23
|
+
* lib/barney/core_ext/jobs.rb:
|
24
|
+
Restrict Array#flatten from recursing more then once. Bug fix.
|
25
|
+
|
26
|
+
2011-06-13 Robert Gleeson <rob@flowof.info>
|
27
|
+
|
28
|
+
* lib/barney/methodlookup.rb:
|
29
|
+
The methods #share, #unshare, and #fork are the only methods available to a block passed to Barney().
|
30
|
+
|
31
|
+
* lib/barney.rb:
|
32
|
+
Remove deprecated methods from Barney module.
|
33
|
+
|
34
|
+
* lib/barney/methodlookup.rb:
|
35
|
+
Add Barney::MethodLookup.
|
36
|
+
|
37
|
+
* lib/barney/emptystate.rb:
|
38
|
+
Remove Barney::EmptyState.
|
39
|
+
|
40
|
+
* lib/barney/core_ext.rb lib/barney/core_ext/barney.rb lib/barney/core_ext/jobs.rb:
|
41
|
+
Separate core_ext.rb into core_ext/barney.rb and core_ext/jobs.rb.
|
42
|
+
|
43
|
+
|
44
|
+
2011-06-11 Robert Gleeson <rob@flowof.info>
|
45
|
+
|
46
|
+
* lib/barney/share.rb:
|
47
|
+
Remove Mutex.
|
48
|
+
Remain thread-safe when one Barney::Share instance is used per-thread.
|
49
|
+
|
1
50
|
2011-05-25 Robert Gleeson <rob@flowof.info>
|
2
51
|
|
52
|
+
* lib/barney/core_ext.rb:
|
53
|
+
Add Barney() and Jobs() methods to lib/barney/core_ext.rb
|
54
|
+
|
55
|
+
* lib/barney.rb:
|
56
|
+
Remove Barney() method from lib/barney.rb
|
57
|
+
|
58
|
+
* lib/barney/jobs.rb:
|
59
|
+
Remove file.
|
60
|
+
|
3
61
|
* lib/barney.rb:
|
4
62
|
Release 0.15.1
|
5
63
|
|
6
64
|
* lib/barney/jobs.rb:
|
7
|
-
Jobs()
|
65
|
+
Jobs() will raise an ArgumentError if block is missing.
|
8
66
|
|
9
67
|
* lib/barney.rb:
|
10
68
|
Release 0.15.0
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (C) 2011 by Robert Gleeson
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
20
|
+
|
data/README.md
CHANGED
@@ -3,41 +3,66 @@
|
|
3
3
|
Barney makes sharing data between processes easy and natural by providing a simple and easy to use DSL.
|
4
4
|
Barney is supported on any Ruby implementation that supports 1.8.7+, 1.9.1+, and that implements `Kernel.fork`.
|
5
5
|
|
6
|
-
Underneath the hood, Barney is using
|
6
|
+
Underneath the hood, Barney is using `Marshal` (the module) to serialize objects and send them across pipes created by `IO.pipe`.
|
7
7
|
If an object can't be serialized by `Marshal`, it can't be shared. That means objects such as anonymous modules,
|
8
8
|
anonymous classes, and Proc objects can't be shared by Barney.
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
I'll give a brief overview of the public API down below.
|
11
|
+
The README isn't meant to be the go-to for documentation, so if you'd like to learn more the [Guides](http://github.com/robgleeson/barney/wiki)
|
12
|
+
have been written to help you along your way.
|
13
|
+
The [API documentation](http://rubydoc.info/github/robgleeson/barney/master/) is written using YARD and takes full advantage of its features.
|
14
|
+
|
13
15
|
|
14
16
|
Usage
|
15
17
|
-----
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
**The Barney method**
|
20
|
+
The Barney method executes each subprocess sequentially so shared data from the first subprocess is available to the next subprocess.
|
21
|
+
It is especially useful if you want to perform some operation that should be restricted to a separate process, but be able to share the result
|
22
|
+
of that operation with the parent process.
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
#!/usr/bin/env ruby
|
26
|
+
require 'barney'
|
27
|
+
|
28
|
+
Barney do
|
29
|
+
name = "Robert"
|
30
|
+
share :name
|
31
|
+
|
32
|
+
fork do
|
33
|
+
name.slice! 3..5
|
34
|
+
end
|
35
|
+
|
36
|
+
p name # "Rob"
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
**The Jobs method**
|
41
|
+
The Jobs method is especially designed for running multiple jobs in parallel.
|
42
|
+
The passed block is executed in one or more subprocesses, with the return value of each subprocess returned to you in an Array.
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
#!/usr/bin/env ruby
|
46
|
+
require 'barney'
|
23
47
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
48
|
+
number = 21
|
49
|
+
results = Jobs(3) { number + number }
|
50
|
+
p results # [42, 42, 42]
|
51
|
+
```
|
52
|
+
|
28
53
|
|
29
|
-
p name # "Rob"
|
30
54
|
|
31
55
|
Documentation
|
32
56
|
--------------
|
33
57
|
|
34
|
-
**
|
58
|
+
**Guides**
|
35
59
|
|
36
60
|
* [Wiki](https://github.com/robgleeson/barney/wiki)
|
37
61
|
|
38
62
|
**API**
|
39
63
|
|
40
64
|
* [master (git)](http://rubydoc.info/github/robgleeson/barney/master/)
|
65
|
+
* [0.16.0](http://rubydoc.info/gems/barney/0.16.0/)
|
41
66
|
* [0.15.1](http://rubydoc.info/gems/barney/0.15.0/)
|
42
67
|
* [0.15.0](http://rubydoc.info/gems/barney/0.15.0/)
|
43
68
|
* [0.14.0](http://rubydoc.info/gems/barney/0.14.0/)
|
@@ -51,7 +76,7 @@ Documentation
|
|
51
76
|
|
52
77
|
**Samples**
|
53
78
|
|
54
|
-
* [Samples](https://github.com/robgleeson/tree/master/samples)
|
79
|
+
* [Samples](https://github.com/robgleeson/barney/tree/master/samples)
|
55
80
|
|
56
81
|
Install
|
57
82
|
--------
|
data/Rakefile
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
desc 'Run test suite.'
|
2
2
|
task :test do
|
3
3
|
$LOAD_PATH.unshift './lib'
|
4
|
-
require '
|
5
|
-
require 'minitest/spec'
|
6
|
-
require 'minitest/autorun'
|
7
|
-
Dir.glob("test/suite/lib/**/*.rb").each { |test| require "./#{test}" }
|
4
|
+
require './test/setup'
|
8
5
|
end
|
9
6
|
|
10
7
|
task :default => :test
|
11
8
|
|
12
|
-
task :rvm_test do
|
13
|
-
puts `rvm 1.8.7,rbx-1.2.2,1.9.2 exec rake test`
|
14
|
-
end
|
data/barney.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift './lib'
|
4
|
+
require 'barney'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "barney"
|
8
|
+
s.version = Barney::VERSION
|
9
|
+
s.authors = ["Robert Gleeson"]
|
10
|
+
s.email = "rob@flowof.info"
|
11
|
+
s.homepage = "http://github.com/robgleeson/barney"
|
12
|
+
s.summary = "Barney tries to make the sharing of data between processes as easy and natural as possible."
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.files = `git ls-files`.each_line.map(&:chomp)
|
16
|
+
s.test_files = Dir.glob "test/**/*.rb"
|
17
|
+
|
18
|
+
s.platform = Gem::Platform::RUBY
|
19
|
+
s.require_path = 'lib'
|
20
|
+
s.rubyforge_project = '[none]'
|
21
|
+
s.required_rubygems_version = '>= 1.3.6'
|
22
|
+
|
23
|
+
s.add_development_dependency 'yard'
|
24
|
+
s.add_development_dependency 'bluecloth' # for yard+markdown.
|
25
|
+
end
|
data/lib/barney.rb
CHANGED
@@ -1,47 +1,11 @@
|
|
1
1
|
require 'thread'
|
2
2
|
require 'barney/share'
|
3
|
-
require 'barney/
|
4
|
-
require 'barney/
|
3
|
+
require 'barney/methodlookup'
|
4
|
+
require 'barney/core_ext/barney'
|
5
|
+
require 'barney/core_ext/jobs'
|
5
6
|
|
6
7
|
module Barney
|
7
|
-
|
8
|
-
VERSION = '0.15.1'
|
9
|
-
@proxy = Barney::Share.new
|
10
|
-
|
11
|
-
class << self
|
12
|
-
|
13
|
-
Barney::Share.instance_methods(false).each do |method|
|
14
|
-
define_method method do |*args, &block|
|
15
|
-
$stderr.puts "[WARNING] Barney.#{method} is deprecated and will be removed in the next release."
|
16
|
-
@proxy.send method, *args, &block
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
8
|
+
VERSION = '0.16.0'
|
22
9
|
end
|
23
10
|
|
24
|
-
|
25
|
-
# Collecting the status of subprocesses and {Barney::Share#sync synchronization} is handled for you.
|
26
|
-
#
|
27
|
-
# @example
|
28
|
-
# name = "Robert"
|
29
|
-
#
|
30
|
-
# Barney do
|
31
|
-
# share :name
|
32
|
-
#
|
33
|
-
# fork do
|
34
|
-
# name.slice! 0..2
|
35
|
-
# end
|
36
|
-
# end
|
37
|
-
#
|
38
|
-
# p name # "Rob"
|
39
|
-
#
|
40
|
-
# @raise [ArgumentError] If no block is supplied.
|
41
|
-
# @return [void]
|
42
|
-
def Barney &block
|
43
|
-
raise ArgumentError, "Block expected" unless block_given?
|
44
|
-
emptystate = Barney::EmptyState.new
|
45
|
-
emptystate.instance_eval &block
|
46
|
-
emptystate.__barney__.wait_all
|
47
|
-
end
|
11
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Evaluates a block in the calling scope but provides access to the {Barney::Share#share},
|
2
|
+
# {Barney::Share#unshare}, and {Barney::Share#fork} methods.
|
3
|
+
# Collecting the status of subprocesses and {Barney::Share#sync synchronization} is handled for you.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
#
|
7
|
+
# Barney do
|
8
|
+
# name = "Robert"
|
9
|
+
# share :name
|
10
|
+
#
|
11
|
+
# fork do
|
12
|
+
# name.slice! 3..5
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# p name # "Rob"
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# @raise [ArgumentError] If no block is supplied.
|
20
|
+
# @raise [NameError] If @__barney__ is defined in the binding for _block_.
|
21
|
+
# @return [void]
|
22
|
+
def Barney &block
|
23
|
+
raise ArgumentError, "Block expected" unless block_given?
|
24
|
+
|
25
|
+
begin
|
26
|
+
Barney::MethodLookup.inject!(&block)
|
27
|
+
block.call
|
28
|
+
ensure
|
29
|
+
Barney::MethodLookup.deject!(&block)
|
30
|
+
end
|
31
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
#
|
2
|
-
# Each block is executed in a subprocess.
|
1
|
+
# Runs a block in one or more subprocesses, returning the return value of the block everytime it is executed.
|
3
2
|
#
|
4
3
|
# @example
|
5
4
|
# results = Jobs(5) { 42 }
|
@@ -7,24 +6,23 @@
|
|
7
6
|
#
|
8
7
|
# @param [Proc] Block The block to execute in a subprocess.
|
9
8
|
# @param [Fixnum] Processes The number of subprocesses to spawn.
|
10
|
-
# @raise [ArgumentError] If block is
|
9
|
+
# @raise [ArgumentError] If no block is supplied.
|
11
10
|
# @return [Array<Object>]
|
12
|
-
def Jobs
|
13
|
-
raise ArgumentError, '
|
11
|
+
def Jobs processes
|
12
|
+
raise ArgumentError, 'Block expected' unless block_given?
|
14
13
|
|
15
14
|
barney = Barney::Share.new
|
16
15
|
barney.share :queue
|
17
16
|
queue = []
|
18
17
|
|
19
|
-
|
18
|
+
processes.times do
|
20
19
|
barney.fork do
|
21
|
-
queue
|
20
|
+
queue.push yield
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
24
|
barney.wait_all
|
26
25
|
barney.sync
|
27
26
|
|
28
|
-
barney.history.map(&:value).flatten
|
27
|
+
barney.history.map(&:value).flatten 1
|
29
28
|
end
|
30
|
-
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Barney
|
2
|
+
module MethodLookup
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
# Extends the "self" referenced by _block_ with a _share_, _unshare_, and _fork_ method.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @param [Proc] Block
|
10
|
+
# @raise [NameError] If @__barney__ is defined in the binding for _block_.
|
11
|
+
# @return [void]
|
12
|
+
def inject! &block
|
13
|
+
module_eval do
|
14
|
+
def share *variables
|
15
|
+
@__barney__.share(*variables)
|
16
|
+
end
|
17
|
+
|
18
|
+
def unshare *variables
|
19
|
+
@__barney__.unshare(*variables)
|
20
|
+
end
|
21
|
+
|
22
|
+
def fork &block
|
23
|
+
@__barney__.fork(&block)
|
24
|
+
@__barney__.wait_all
|
25
|
+
@__barney__.sync
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
target = block.binding.eval "self"
|
30
|
+
scope_polluted = target.instance_variable_defined? :@__barney__
|
31
|
+
|
32
|
+
if scope_polluted
|
33
|
+
raise NameError, "The instance variable @__barney__ has already been defined!\n" \
|
34
|
+
"Barney would like to use it, but it looks like you are using it for something else."
|
35
|
+
else
|
36
|
+
target.instance_variable_set :@__barney__, Barney::Share.new
|
37
|
+
target.extend Barney::MethodLookup
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Removes _share_, _unshare_, and _fork_ from the "self" referenced by _block_.
|
42
|
+
# Future method calls for _share_, _unshare_, and _fork_ will be made against "self",
|
43
|
+
# its superclasses, or modules it includes.
|
44
|
+
#
|
45
|
+
# @api private
|
46
|
+
# @param [Proc] Block
|
47
|
+
# @return [void]
|
48
|
+
def deject! &block
|
49
|
+
target = block.binding.eval "self"
|
50
|
+
target.send :remove_instance_variable, :@__barney__ rescue nil
|
51
|
+
|
52
|
+
remove_method :share
|
53
|
+
remove_method :unshare
|
54
|
+
remove_method :fork
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
data/lib/barney/share.rb
CHANGED
@@ -12,20 +12,6 @@ module Barney
|
|
12
12
|
# @attr [Object] value The value of the variable.
|
13
13
|
HistoryItem = Struct.new :variable, :value
|
14
14
|
|
15
|
-
@mutex = Mutex.new
|
16
|
-
|
17
|
-
class << self
|
18
|
-
# Returns the last value read from a spawned child process.
|
19
|
-
# @api private
|
20
|
-
# @return [Object]
|
21
|
-
attr_accessor :value
|
22
|
-
|
23
|
-
# Returns a Mutex that is used by the {Barney::Share#sync} method.
|
24
|
-
# @api private
|
25
|
-
# @return [Mutex]
|
26
|
-
attr_reader :mutex
|
27
|
-
end
|
28
|
-
|
29
15
|
# Returns a list of all variables or constants being shared for an instance of {Barney::Share}.
|
30
16
|
# @return [Array<Symbol>]
|
31
17
|
attr_reader :variables
|
@@ -55,7 +41,7 @@ module Barney
|
|
55
41
|
# @param [Symbol, #to_sym] Variable Accepts the name(s) of the variables or constants you want to share.
|
56
42
|
# @return [Array<Symbol>] Returns a list of all variables that are being shared.
|
57
43
|
def share *variables
|
58
|
-
@variables.push
|
44
|
+
@variables.push(*variables.map(&:to_sym))
|
59
45
|
@variables.uniq!
|
60
46
|
@variables
|
61
47
|
end
|
@@ -98,7 +84,7 @@ module Barney
|
|
98
84
|
end
|
99
85
|
end
|
100
86
|
|
101
|
-
@streams.push
|
87
|
+
@streams.push(*streams)
|
102
88
|
@pids.push @pid
|
103
89
|
@pid
|
104
90
|
end
|
@@ -106,16 +92,16 @@ module Barney
|
|
106
92
|
# Synchronizes data between the parent and child process.
|
107
93
|
# @return [void]
|
108
94
|
def synchronize
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
95
|
+
@streams.each do |stream|
|
96
|
+
stream.out.close
|
97
|
+
Thread.current[:BARNEY_SERIALIZED_OBJECT] = Marshal.load stream.in.read
|
98
|
+
stream.in.close
|
99
|
+
value = @scope.eval "#{stream.variable} = ::Thread.current[:BARNEY_SERIALIZED_OBJECT]"
|
100
|
+
@history.push HistoryItem.new(stream.variable, value)
|
101
|
+
end
|
102
|
+
|
103
|
+
Thread.current[:BARNEY_SERIALIZED_OBJECT] = nil
|
104
|
+
@streams.clear
|
119
105
|
end
|
120
106
|
alias_method :sync, :synchronize
|
121
107
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'barney'
|
2
|
+
|
3
|
+
class Example
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@name = "Rob"
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute!
|
12
|
+
Barney do
|
13
|
+
share :@name
|
14
|
+
fork { @name = "Bob" }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
example = Example.new
|
21
|
+
example.execute!
|
22
|
+
p example.name # => "Bob"
|
data/test/setup.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
describe '#Barney' do
|
2
|
+
|
3
|
+
describe 'synchronization' do
|
4
|
+
before do
|
5
|
+
@name = nil
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should synchronize a local variable.' do
|
9
|
+
name = 'Robert'
|
10
|
+
|
11
|
+
Barney do
|
12
|
+
share :name
|
13
|
+
fork { name.slice! 3..5}
|
14
|
+
fork { name.slice! 1..2 }
|
15
|
+
end
|
16
|
+
|
17
|
+
assert_equal "R", name
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should synchronize an instance variable.' do
|
21
|
+
@name = 'Robert'
|
22
|
+
|
23
|
+
Barney do
|
24
|
+
share :@name
|
25
|
+
fork { @name.slice! 3..5 }
|
26
|
+
fork { @name.slice! 1..2 }
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_equal "R", @name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'scope' do
|
34
|
+
it 'should raise a NameError when @__barney__ is already defined.' do
|
35
|
+
@__barney__ = nil
|
36
|
+
assert_raises NameError do
|
37
|
+
Barney {}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should always unpollute the calling scope, even if an exception is raised in the passed block.' do
|
42
|
+
begin
|
43
|
+
Barney do
|
44
|
+
raise
|
45
|
+
end
|
46
|
+
rescue
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_equal false , instance_variable_defined?(:@__barney__)
|
50
|
+
assert_equal Kernel, method(:fork).owner
|
51
|
+
assert_raises(NameError) { method(:share).owner }
|
52
|
+
assert_raises(NameError) { method(:unshare).owner }
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should be able to call methods in the calling scope.' do
|
56
|
+
klass = MethodScopeTest.new
|
57
|
+
klass.execute
|
58
|
+
|
59
|
+
assert_equal true, klass.run
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should evaluate the passed block in the context it was created in.' do
|
63
|
+
klass = SelfScopeTest.new
|
64
|
+
klass.execute
|
65
|
+
|
66
|
+
assert_equal "SelfScopeTest", klass.self
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should inject and then deject #share, #unshare and #fork on the calling self.' do
|
70
|
+
Barney do
|
71
|
+
assert_equal "#Barney::scope" , self.class.to_s
|
72
|
+
assert_equal Barney::MethodLookup, method(:share).owner
|
73
|
+
assert_equal Barney::MethodLookup, method(:unshare).owner
|
74
|
+
assert_equal Barney::MethodLookup, method(:fork).owner
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_equal "#Barney::scope", self.class.to_s
|
78
|
+
assert_raises(NameError) { method(:share) }
|
79
|
+
assert_raises(NameError) { method(:unshare) }
|
80
|
+
assert_equal Kernel, method(:fork).owner
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe '#Jobs' do
|
2
|
+
|
3
|
+
it 'should spawn workers, and share their return value with the parent.' do
|
4
|
+
result = Jobs(5) { 42 }
|
5
|
+
assert_equal [42, 42, 42, 42, 42], result
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
it 'should have execute the passed block in the calling scope.' do
|
10
|
+
number = 21
|
11
|
+
result = Jobs(5) { number + number }
|
12
|
+
assert_equal [42, 42, 42, 42, 42], result
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return an array of arrays when an array is returned by a subprocess.' do
|
16
|
+
result = Jobs(2) { [1] }
|
17
|
+
assert_equal [[1], [1]], result
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -23,12 +23,12 @@ describe Barney::Share do
|
|
23
23
|
obj.share :str
|
24
24
|
|
25
25
|
%w(r u b y).each do |letter|
|
26
|
-
|
26
|
+
obj.fork do
|
27
27
|
str << letter
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
obj.wait_all
|
32
32
|
obj.sync
|
33
33
|
|
34
34
|
str = obj.history.map(&:value).join
|
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.16.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-
|
13
|
+
date: 2011-06-29 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -44,25 +44,35 @@ extensions: []
|
|
44
44
|
extra_rdoc_files: []
|
45
45
|
|
46
46
|
files:
|
47
|
-
-
|
48
|
-
-
|
47
|
+
- .gemtest
|
48
|
+
- .gitignore
|
49
|
+
- .travis.yml
|
49
50
|
- .yardopts
|
50
|
-
- README.md
|
51
51
|
- ChangeLog
|
52
|
-
-
|
53
|
-
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
52
|
+
- Gemfile
|
53
|
+
- LICENSE.txt
|
54
|
+
- README.md
|
55
|
+
- Rakefile
|
56
|
+
- barney.gemspec
|
57
57
|
- lib/barney.rb
|
58
|
-
-
|
58
|
+
- lib/barney/core_ext/barney.rb
|
59
|
+
- lib/barney/core_ext/jobs.rb
|
60
|
+
- lib/barney/methodlookup.rb
|
61
|
+
- lib/barney/share.rb
|
62
|
+
- samples/barney_method_sample.rb
|
63
|
+
- samples/jobs_method_sample.rb
|
64
|
+
- test/helpers/methodscopetest.rb
|
65
|
+
- test/helpers/selfscopetest.rb
|
66
|
+
- test/setup.rb
|
67
|
+
- test/suite/lib/barney/core_ext/barney.rb
|
68
|
+
- test/suite/lib/barney/core_ext/jobs.rb
|
59
69
|
- test/suite/lib/barney/share#fork.rb
|
60
70
|
- test/suite/lib/barney/share#history.rb
|
61
71
|
- test/suite/lib/barney/share#initialize.rb
|
62
72
|
- test/suite/lib/barney/share#shared.rb
|
63
73
|
- test/suite/lib/barney/share#synchronize.rb
|
64
74
|
- test/suite/lib/barney/share#unshare.rb
|
65
|
-
- test/suite/
|
75
|
+
- test/suite/misc/warnings.rb
|
66
76
|
has_rdoc: true
|
67
77
|
homepage: http://github.com/robgleeson/barney
|
68
78
|
licenses: []
|
@@ -92,11 +102,15 @@ signing_key:
|
|
92
102
|
specification_version: 3
|
93
103
|
summary: Barney tries to make the sharing of data between processes as easy and natural as possible.
|
94
104
|
test_files:
|
95
|
-
- test/
|
105
|
+
- test/helpers/methodscopetest.rb
|
106
|
+
- test/helpers/selfscopetest.rb
|
107
|
+
- test/setup.rb
|
108
|
+
- test/suite/lib/barney/core_ext/barney.rb
|
109
|
+
- test/suite/lib/barney/core_ext/jobs.rb
|
96
110
|
- test/suite/lib/barney/share#fork.rb
|
97
111
|
- test/suite/lib/barney/share#history.rb
|
98
112
|
- test/suite/lib/barney/share#initialize.rb
|
99
113
|
- test/suite/lib/barney/share#shared.rb
|
100
114
|
- test/suite/lib/barney/share#synchronize.rb
|
101
115
|
- test/suite/lib/barney/share#unshare.rb
|
102
|
-
- test/suite/
|
116
|
+
- test/suite/misc/warnings.rb
|
data/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (C) 2011 by Robert Gleeson
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
-
of this software and associated documentation files (the "Software"), to deal
|
5
|
-
in the Software without restriction, including without limitation the rights
|
6
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
-
copies of the Software, and to permit persons to whom the Software is
|
8
|
-
furnished to do so, subject to the following conditions:
|
9
|
-
|
10
|
-
The above copyright notice and this permission notice shall be included in
|
11
|
-
all copies or substantial portions of the Software.
|
12
|
-
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
-
THE SOFTWARE.
|
20
|
-
|
data/lib/barney/emptystate.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module Barney
|
2
|
-
|
3
|
-
class EmptyState
|
4
|
-
attr_reader :__barney__
|
5
|
-
|
6
|
-
Barney::Share.instance_methods(false).each do |meth|
|
7
|
-
define_method meth do |*args, &block|
|
8
|
-
@__barney__.send meth, *args, &block
|
9
|
-
end
|
10
|
-
|
11
|
-
undef_method :fork
|
12
|
-
|
13
|
-
define_method :fork do |*args, &block|
|
14
|
-
@__barney__.send :fork, *args, &block
|
15
|
-
@__barney__.sync
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@__barney__ = Barney::Share.new
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
data/samples/Barney_method.rb
DELETED
data/test/suite/lib/barney.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
describe 'Barney' do
|
2
|
-
|
3
|
-
it 'should respond to all Barney::Share methods.' do
|
4
|
-
methods = Barney::Share.instance_methods false
|
5
|
-
methods.each do |meth|
|
6
|
-
assert Barney.respond_to?(meth.to_sym), "Barney should respond to #{meth}"
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
describe '#Barney' do
|
13
|
-
|
14
|
-
it 'should synchronize data using the #Barney() method.' do
|
15
|
-
name = 'Robert'
|
16
|
-
|
17
|
-
Barney do
|
18
|
-
share :name
|
19
|
-
fork { name.slice! 3..5}
|
20
|
-
fork { name.slice! 1..2 }
|
21
|
-
end
|
22
|
-
|
23
|
-
assert_equal "R", name
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|