asir 1.2.1 → 1.2.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/.gitignore +2 -1
- data/ChangeLog +6 -0
- data/asir.gemspec +4 -4
- data/example/ex03.rb +2 -0
- data/example/ex06.rb +1 -3
- data/example/ex09.rb +1 -1
- data/example/ex10.rb +1 -1
- data/example/ex11.rb +1 -1
- data/example/ex16.rb +28 -0
- data/example/ex23.rb +3 -0
- data/example/example_helper.rb +28 -42
- data/hack_night/solution/prob-3.rb +2 -0
- data/hack_night/solution/prob-6.rb +2 -0
- data/hack_night/solution/prob-7.rb +2 -0
- data/lab/spoon_test.rb +18 -0
- data/lib/asir.rb +1 -0
- data/lib/asir/application.rb +118 -0
- data/lib/asir/channel.rb +13 -1
- data/lib/asir/error.rb +12 -1
- data/lib/asir/fifo.rb +30 -0
- data/lib/asir/retry_behavior.rb +3 -1
- data/lib/asir/system.rb +12 -0
- data/lib/asir/thread_pool.rb +0 -3
- data/lib/asir/transport.rb +4 -0
- data/lib/asir/transport/broadcast.rb +2 -0
- data/lib/asir/transport/fallback.rb +2 -0
- data/lib/asir/transport/file.rb +49 -10
- data/lib/asir/transport/stream.rb +2 -0
- data/lib/asir/transport/webrick.rb +2 -0
- data/lib/asir/uuid.rb +3 -3
- data/lib/asir/version.rb +1 -1
- data/spec/example_spec.rb +45 -17
- data/spec/yaml_spec.rb +26 -9
- metadata +110 -106
data/.gitignore
CHANGED
data/ChangeLog
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
2012-12-31 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
|
+
|
3
|
+
* v1.2.2: New Version: JRuby support.
|
4
|
+
* File: Support for two-way named fifo services.
|
5
|
+
* JRuby: JRuby tests pass.
|
6
|
+
|
1
7
|
2012-12-29 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
8
|
|
3
9
|
* v1.2.1: New version: API changes.
|
data/asir.gemspec
CHANGED
@@ -22,15 +22,15 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.extra_rdoc_files = [ "README.textile" ]
|
23
23
|
s.rdoc_options = ["--charset=UTF-8"]
|
24
24
|
|
25
|
-
|
26
|
-
# see lib/asir/uuid.rb
|
27
|
-
gem.add_dependency "uuid", "~> 2.3.6"
|
28
|
-
end
|
25
|
+
gem.add_dependency "uuid", "~> 2.3.6"
|
29
26
|
s.add_dependency "httpclient", "~> 2.3.0"
|
30
27
|
s.add_dependency "rack", "~> 1.4.1"
|
31
28
|
|
32
29
|
s.add_development_dependency 'rake', '>= 0.9.0'
|
33
30
|
s.add_development_dependency 'rspec', '~> 2.12.0'
|
34
31
|
s.add_development_dependency 'simplecov', '>= 0.1'
|
32
|
+
if (RUBY_ENGINE rescue 'UNKNOWN') =~ /jruby/i
|
33
|
+
s.add_development_dependency 'spoon', '>= 0.0.1'
|
34
|
+
end
|
35
35
|
end
|
36
36
|
|
data/example/ex03.rb
CHANGED
@@ -10,9 +10,11 @@ begin
|
|
10
10
|
pr Email.asir.send_email(:pdf_invoice,
|
11
11
|
:to => "user@email.com",
|
12
12
|
:customer => @customer)
|
13
|
+
sleep 1
|
13
14
|
end
|
14
15
|
|
15
16
|
# !SLIDE END
|
17
|
+
# PENDING: RUBY_PLATFORM =~ /java/i
|
16
18
|
# EXPECT: : client process
|
17
19
|
# EXPECT: : Email.send_mail :pdf_invoice
|
18
20
|
# EXPECT: : pr: nil
|
data/example/ex06.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
# !SLIDE :capture_code_output true
|
2
2
|
# One-way, named pipe service
|
3
3
|
|
4
|
-
$stderr.puts " #{$$} at #{__FILE__}:#{__LINE__}"
|
5
|
-
|
6
4
|
require 'example_helper'
|
7
5
|
begin
|
8
|
-
File.unlink(service_pipe = "service.pipe") rescue nil
|
6
|
+
File.unlink(service_pipe = "#{__FILE__}.service.pipe") rescue nil
|
9
7
|
Email.asir.transport = t =
|
10
8
|
ASIR::Transport::File.new(:file => service_pipe)
|
11
9
|
t.encoder =
|
data/example/ex09.rb
CHANGED
data/example/ex10.rb
CHANGED
data/example/ex11.rb
CHANGED
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
ASIR::Transport::Broadcast.new(:transports => [
|
12
12
|
file = ASIR::Transport::File.new(:file => service_log,
|
13
13
|
:encoder => ASIR::Coder::Yaml.new(:yaml_options => { :ASCII_8BIT_ok => true })),
|
14
|
-
ASIR::Transport::
|
14
|
+
ASIR::Transport::Local.new,
|
15
15
|
]),
|
16
16
|
])
|
17
17
|
pr Email.asir.send_email(:pdf_invoice,
|
data/example/ex16.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# !SLIDE :capture_code_output true
|
2
|
+
# Two-way, Named Pipe service
|
3
|
+
|
4
|
+
require 'example_helper'
|
5
|
+
begin
|
6
|
+
File.unlink(service_log = "#{__FILE__}.service.pipe") rescue nil
|
7
|
+
Email.asir.transport = t =
|
8
|
+
ASIR::Transport::File.new(:file => service_log, :one_way => false, :result_fifo => true)
|
9
|
+
t.encoder =
|
10
|
+
ASIR::Coder::Yaml.new(:yaml_options => { :ASCII_8BIT_ok => true })
|
11
|
+
server_process do
|
12
|
+
t.prepare_server!
|
13
|
+
t.run_server!
|
14
|
+
end
|
15
|
+
sleep 1
|
16
|
+
pr Email.asir.send_email(:pdf_invoice,
|
17
|
+
:to => "user@email.com",
|
18
|
+
:customer => @customer)
|
19
|
+
ensure
|
20
|
+
t.close rescue nil; sleep 1; server_kill
|
21
|
+
end
|
22
|
+
|
23
|
+
# !SLIDE END
|
24
|
+
# PENDING: RUBY_PLATFORM =~ /java/i
|
25
|
+
# EXPECT: : client process
|
26
|
+
# EXPECT: : server process
|
27
|
+
# EXPECT: : Email.send_mail :pdf_invoice
|
28
|
+
# EXPECT: : pr: :ok
|
data/example/ex23.rb
CHANGED
@@ -10,9 +10,12 @@ begin
|
|
10
10
|
:to => "user@email.com",
|
11
11
|
:customer => @customer) { | resp |
|
12
12
|
pr [ :in_block, resp.result ] })
|
13
|
+
ensure
|
14
|
+
sleep 1
|
13
15
|
end
|
14
16
|
|
15
17
|
# !SLIDE END
|
18
|
+
# PENDING: RUBY_PLATFORM =~ /java/i
|
16
19
|
# EXPECT: : client process
|
17
20
|
# EXPECT: : Email.send_mail :pdf_invoice
|
18
21
|
# EXPECT: : pr: nil
|
data/example/example_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Sample client support
|
2
2
|
#
|
3
|
+
|
3
4
|
require 'rubygems'
|
4
5
|
case RUBY_PLATFORM
|
5
6
|
when /java/i
|
@@ -25,6 +26,7 @@ require 'delayed_service'
|
|
25
26
|
require 'unsafe_service'
|
26
27
|
|
27
28
|
require 'pp'
|
29
|
+
require 'timeout'
|
28
30
|
require File.expand_path('../../spec/debug_helper', __FILE__)
|
29
31
|
|
30
32
|
@customer = 123
|
@@ -35,63 +37,47 @@ def pr result
|
|
35
37
|
$stdout.puts "*** #{$$}: pr: #{PP.pp(result, '')}"
|
36
38
|
end
|
37
39
|
|
40
|
+
# Work-around lack of fork in JRuby.
|
41
|
+
require 'asir/application'
|
42
|
+
$asir_app = ASIR::Application.new
|
43
|
+
$asir_app.inc = [ 'example', 'lib' ]
|
44
|
+
$asir_server = nil
|
45
|
+
|
38
46
|
def server_process &blk
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# So we must prevent spawn a new jruby and
|
44
|
-
# instruct it to only run the server blk, and not
|
45
|
-
# the subsequent client code.
|
46
|
-
# In other words, we cannot rely on how Process.fork
|
47
|
-
# terminates within the block.
|
48
|
-
if ENV['ASIR_JRUBY_SPAWNED']
|
49
|
-
$stderr.puts " spawned server at #{__FILE__}:#{__LINE__}"
|
50
|
-
puts "*** #{$$}: server process"; $stdout.flush
|
51
|
-
begin
|
52
|
-
yield
|
53
|
-
rescue ::Exception => exc
|
54
|
-
$stderr.puts "*** #{$$}: service ERROR: #{exc.inspect}\n #{exc.backtrace * " \n"}"
|
55
|
-
raise exc
|
56
|
-
end
|
57
|
-
Process.exit!(0)
|
58
|
-
# dont do client, client is our parent process.
|
59
|
-
else
|
60
|
-
$stderr.puts " spawning at #{__FILE__}:#{__LINE__}"
|
61
|
-
ENV['ASIR_JRUBY_SPAWNED'] = "1"
|
62
|
-
cmd = "ruby -I #{File.dirname(__FILE__)} -I #{File.expand_path('../../lib', __FILE__)} #{$0} #{ARGV * ' '}"
|
63
|
-
$stderr.puts " cmd = #{cmd}"
|
64
|
-
$server_pid = Spoon.spawnp(cmd)
|
65
|
-
ENV.delete('ASIR_JRUBY_SPAWNED')
|
66
|
-
$stderr.puts " spawned #{$server_pid} at #{__FILE__}:#{__LINE__}"
|
67
|
-
end
|
68
|
-
else
|
69
|
-
# $stderr.puts " at #{__FILE__}:#{__LINE__}"
|
70
|
-
$server_pid = Process.fork do
|
71
|
-
puts "*** #{$$}: server process"; $stdout.flush
|
72
|
-
begin
|
47
|
+
$asir_server = $asir_app.spawn :server do
|
48
|
+
puts "*** #{$$}: server process"; $stdout.flush
|
49
|
+
begin
|
50
|
+
Timeout.timeout(20, ASIR::Error::Fatal) do
|
73
51
|
yield
|
74
|
-
rescue ::Exception => exc
|
75
|
-
$stderr.puts "*** #{$$}: service ERROR: #{exc.inspect}\n #{exc.backtrace * " \n"}"
|
76
|
-
raise exc
|
77
52
|
end
|
53
|
+
rescue ::Exception => exc
|
54
|
+
$stderr.puts "*** #{$$}: service ERROR: #{exc.inspect}\n #{exc.backtrace * " \n"}"
|
55
|
+
raise exc
|
78
56
|
end
|
79
57
|
end
|
80
|
-
|
58
|
+
$asir_app.main do
|
59
|
+
$asir_server.go!
|
60
|
+
$server_pid = $asir_server.pid
|
61
|
+
sleep 1 # wait for server to be ready.
|
62
|
+
end
|
81
63
|
return false # do client.
|
82
64
|
end
|
83
65
|
|
84
66
|
def server_kill
|
85
67
|
if $server_pid
|
86
|
-
|
87
|
-
Process.waitpid($server_pid)
|
68
|
+
$asir_server.kill
|
88
69
|
end
|
89
|
-
rescue Errno::ESRCH
|
90
70
|
ensure
|
91
71
|
$server_pid = nil
|
92
72
|
end
|
93
73
|
|
74
|
+
end # class Object
|
75
|
+
|
76
|
+
module Process
|
77
|
+
include ASIR::Client
|
94
78
|
end
|
95
79
|
|
96
|
-
|
80
|
+
unless $asir_app.in_spawn?
|
81
|
+
puts "*** #{$$}: client process"; $stdout.flush
|
82
|
+
end
|
97
83
|
|
data/lab/spoon_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
require 'asir/application'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
begin
|
7
|
+
app = ASIR::Application.new
|
8
|
+
spawn = app.spawn :hello do
|
9
|
+
$stderr.puts "Hello from spawn #{$$}"
|
10
|
+
end
|
11
|
+
app.main do
|
12
|
+
$stderr.puts "Hello from main #{$$}"
|
13
|
+
spawn.go!
|
14
|
+
spawn.wait
|
15
|
+
end
|
16
|
+
rescue ::Exception
|
17
|
+
$stderr.puts "ERROR: #{$!.inspect}\n #{$!.backtrace * "\n "}"
|
18
|
+
end
|
data/lib/asir.rb
CHANGED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'asir/system'
|
2
|
+
|
3
|
+
module ASIR
|
4
|
+
# Ugly workaround JRuby's lack of fork().
|
5
|
+
class Application
|
6
|
+
attr_accessor :inc, :verbose
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@inc = [ ]
|
10
|
+
@name_to_spawn = { }
|
11
|
+
end
|
12
|
+
|
13
|
+
def spawn name, &blk
|
14
|
+
name = name.to_sym
|
15
|
+
spawn = Spawn.new
|
16
|
+
@name_to_spawn[spawn.name = name] = spawn
|
17
|
+
spawn.app = self
|
18
|
+
spawn.blk = blk
|
19
|
+
spawn
|
20
|
+
end
|
21
|
+
|
22
|
+
class Spawn
|
23
|
+
attr_accessor :name, :blk, :app, :pid, :cmd, :tmp, :tmp_out
|
24
|
+
def verbose; app.verbose; end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"#<#{self.class.name} #{name.inspect} #{@pid} >"
|
28
|
+
end
|
29
|
+
|
30
|
+
def go!
|
31
|
+
case RUBY_PLATFORM
|
32
|
+
when /java/i
|
33
|
+
@tmp = "/tmp/#{$$}.#{name}"
|
34
|
+
@tmp_out = "#{tmp}.out"
|
35
|
+
@tmp_run = "#{tmp}.run"
|
36
|
+
File.unlink(@tmp_out) rescue nil
|
37
|
+
File.unlink(@tmp_run) rescue nil
|
38
|
+
begin
|
39
|
+
require 'spoon'
|
40
|
+
ruby = ASIR.ruby_path
|
41
|
+
# ruby = "/usr/bin/ruby"
|
42
|
+
inc = app.inc.map{|x| "-I#{x}"}
|
43
|
+
@cmd = [ ruby ]
|
44
|
+
@cmd.concat(inc)
|
45
|
+
@cmd.concat([ $0, "--asir-spawn=#{name}", @tmp ])
|
46
|
+
$stderr.puts "#{self} cmd #{cmd * ' '}" if verbose
|
47
|
+
@pid = Spoon.spawnp(*cmd)
|
48
|
+
# Wait until started.
|
49
|
+
until File.exist?(@tmp_run)
|
50
|
+
sleep 0.1
|
51
|
+
end
|
52
|
+
ensure
|
53
|
+
File.unlink(@tmp_run) rescue nil
|
54
|
+
end
|
55
|
+
else
|
56
|
+
@pid = Process.fork(&blk)
|
57
|
+
end
|
58
|
+
@pid
|
59
|
+
end
|
60
|
+
|
61
|
+
def kill
|
62
|
+
Process.kill 9, pid
|
63
|
+
wait
|
64
|
+
end
|
65
|
+
|
66
|
+
def wait
|
67
|
+
# Wait until finished and collect output.
|
68
|
+
begin
|
69
|
+
Process.waitpid(pid)
|
70
|
+
while true
|
71
|
+
Process.kill(0, pid)
|
72
|
+
sleep 1
|
73
|
+
end
|
74
|
+
rescue Errno::ECHILD, Errno::ESRCH
|
75
|
+
ensure
|
76
|
+
$stderr.puts "Spawn #{self} finished" if verbose
|
77
|
+
@pid = nil
|
78
|
+
if tmp_out && File.exist?(tmp_out)
|
79
|
+
$stdout.write(File.read(tmp_out))
|
80
|
+
File.unlink(tmp_out)
|
81
|
+
end
|
82
|
+
@tmp_out = nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end # class
|
86
|
+
|
87
|
+
def in_spawn?
|
88
|
+
return @in_spawn unless @in_spawn.nil?
|
89
|
+
@in_spawn = false
|
90
|
+
$stderr.puts "#{$$} ARGV = #{ARGV.inspect}" if verbose
|
91
|
+
if ARGV.size >= 1 and ARGV[0] =~ /^--asir-spawn=(.*)/
|
92
|
+
@in_spawn = $1.to_sym
|
93
|
+
end
|
94
|
+
@in_spawn
|
95
|
+
end
|
96
|
+
|
97
|
+
def main
|
98
|
+
if in_spawn?
|
99
|
+
begin
|
100
|
+
name = @in_spawn
|
101
|
+
if tmp = ARGV[1]
|
102
|
+
out = "#{tmp}.out"
|
103
|
+
run = "#{tmp}.run"
|
104
|
+
$stdout = $stderr = File.open(out, "w")
|
105
|
+
STDOUT.reopen($stdout); STDERR.reopen($stderr)
|
106
|
+
File.open(run, "w") { | fh | fh.puts $$ }
|
107
|
+
end
|
108
|
+
spawn = @name_to_spawn[name]
|
109
|
+
raise "#{$$} #{self} Cannot find spawn name #{name.inspect}" unless spawn
|
110
|
+
spawn.blk.call
|
111
|
+
ensure
|
112
|
+
Process.exit!(0)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
yield if block_given?
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/lib/asir/channel.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'asir'
|
2
2
|
require 'asir/retry_behavior'
|
3
|
+
require 'thread'
|
3
4
|
|
4
5
|
module ASIR
|
5
6
|
# Generic I/O Channel abstraction.
|
@@ -20,6 +21,7 @@ module ASIR
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def initialize opts = nil
|
24
|
+
@mutex = Mutex.new
|
23
25
|
@on_close = ON_CLOSE
|
24
26
|
@on_error = ON_ERROR
|
25
27
|
# @on_retry = ON_RETRY
|
@@ -48,6 +50,10 @@ module ASIR
|
|
48
50
|
@on_connect.call(self)
|
49
51
|
when :retry #, exc
|
50
52
|
exc = data
|
53
|
+
case exc
|
54
|
+
when *Error::Unrecoverable.modules
|
55
|
+
raise exc
|
56
|
+
end
|
51
57
|
$stderr.puts "RETRY: #{n_try}: ERROR : #{data.inspect}"
|
52
58
|
@on_retry.call(self, exc, :connect) if @on_retry
|
53
59
|
when :failed
|
@@ -57,7 +63,7 @@ module ASIR
|
|
57
63
|
end
|
58
64
|
end
|
59
65
|
end
|
60
|
-
|
66
|
+
|
61
67
|
# Invokes @on_close.call(self, stream).
|
62
68
|
# On Exception, invokes @on_error.call(self, exc, :close, stream).
|
63
69
|
def close
|
@@ -65,6 +71,8 @@ module ASIR
|
|
65
71
|
self.stream = nil
|
66
72
|
@on_close.call(self, stream) if @on_close
|
67
73
|
end
|
74
|
+
rescue *Error::Unrecoverable.modules
|
75
|
+
raise
|
68
76
|
rescue ::Exception => exc
|
69
77
|
handle_error!(exc, :close, stream)
|
70
78
|
end
|
@@ -75,6 +83,8 @@ module ASIR
|
|
75
83
|
x = stream
|
76
84
|
begin
|
77
85
|
yield x
|
86
|
+
rescue *Error::Unrecoverable.modules
|
87
|
+
raise
|
78
88
|
rescue ::Exception => exc
|
79
89
|
handle_error!(exc, :with_stream, x)
|
80
90
|
end
|
@@ -100,6 +110,7 @@ module ASIR
|
|
100
110
|
# Returns a Thread-specific mapping, unique to this process id.
|
101
111
|
# Maps from Channel objects to actual stream.
|
102
112
|
def _streams
|
113
|
+
@mutex.synchronize do
|
103
114
|
streams = Thread.current[:'ASIR::Channel._streams'] ||= { }
|
104
115
|
if @owning_process != $$ || # child process?
|
105
116
|
@owning_process > $$ # PIDs wrapped around?
|
@@ -107,6 +118,7 @@ module ASIR
|
|
107
118
|
streams.clear
|
108
119
|
end
|
109
120
|
streams
|
121
|
+
end
|
110
122
|
end
|
111
123
|
|
112
124
|
# Returns the stream for this Channel, or nil.
|
data/lib/asir/error.rb
CHANGED
@@ -7,12 +7,22 @@ module ASIR
|
|
7
7
|
# Unsupported Feature.
|
8
8
|
class Unsupported < self; end
|
9
9
|
|
10
|
-
# Unimplemented Feature
|
10
|
+
# Unimplemented Feature.
|
11
11
|
class Unimplemented < self; end
|
12
12
|
|
13
13
|
# Requested Stop.
|
14
14
|
class Terminate < self; end
|
15
15
|
|
16
|
+
# Unrecoverable Errors.
|
17
|
+
class Unrecoverable < self
|
18
|
+
def self.modules; @@modules; end
|
19
|
+
def self.modules= x; @@modules = x; end
|
20
|
+
@@modules ||= [ self ]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Fatal Errors.
|
24
|
+
class Fatal < Unrecoverable; end
|
25
|
+
|
16
26
|
# Unforwardable Exception.
|
17
27
|
#
|
18
28
|
# This encapsulates an Exception that should never be
|
@@ -38,6 +48,7 @@ module ASIR
|
|
38
48
|
::Interrupt,
|
39
49
|
::SignalException,
|
40
50
|
Error::Terminate,
|
51
|
+
Error::Unrecoverable,
|
41
52
|
]
|
42
53
|
end
|
43
54
|
end
|
data/lib/asir/fifo.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module ASIR
|
2
|
+
# Module to create FIFO/Named Pipes.
|
3
|
+
module Fifo
|
4
|
+
begin
|
5
|
+
require 'ffi'
|
6
|
+
module LIBC
|
7
|
+
extend FFI::Library
|
8
|
+
ffi_lib FFI::Library::LIBC
|
9
|
+
attach_function :mkfifo, [ :string, :long ], :int
|
10
|
+
end
|
11
|
+
def mkfifo file, perms = nil
|
12
|
+
perms ||= 0600
|
13
|
+
if LIBC.mkfifo(file, perms) < 0
|
14
|
+
raise "mkfifo(#{file.inspect}, #{'0%o' % perms}) failed"
|
15
|
+
end
|
16
|
+
true
|
17
|
+
end
|
18
|
+
rescue ::Exception => exc
|
19
|
+
def mkfifo file, perms = nil
|
20
|
+
perms ||= 0600
|
21
|
+
system(cmd = "mkfifo #{file.inspect}") or raise "cannot run #{cmd.inspect}"
|
22
|
+
::File.chmod(perms, file) rescue nil if perms
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
extend self
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
data/lib/asir/retry_behavior.rb
CHANGED
@@ -24,7 +24,9 @@ module ASIR
|
|
24
24
|
n_try += 1
|
25
25
|
result = yield :try, n_try
|
26
26
|
done = true
|
27
|
-
rescue *Error::
|
27
|
+
rescue *Error::Unrecoverable.modules
|
28
|
+
raise
|
29
|
+
rescue *Error::Unforwardable.unforwardable
|
28
30
|
raise
|
29
31
|
rescue ::Exception => exc
|
30
32
|
last_exception = exc
|
data/lib/asir/system.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module ASIR
|
2
|
+
::RUBY_ENGINE = 'UNKNOWN'.freeze unless defined? ::RUBY_ENGINE
|
3
|
+
def self.ruby_path
|
4
|
+
@@ruby_path ||=
|
5
|
+
begin
|
6
|
+
require 'rbconfig'
|
7
|
+
File.join(RbConfig::CONFIG["bindir"],
|
8
|
+
RbConfig::CONFIG["RUBY_INSTALL_NAME"] +
|
9
|
+
RbConfig::CONFIG["EXEEXT"]).freeze
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/asir/thread_pool.rb
CHANGED
data/lib/asir/transport.rb
CHANGED
@@ -157,6 +157,8 @@ module ASIR
|
|
157
157
|
else
|
158
158
|
nil
|
159
159
|
end
|
160
|
+
rescue *Error::Unrecoverable.modules
|
161
|
+
raise
|
160
162
|
rescue ::Exception => exc
|
161
163
|
exception = original_exception = exc
|
162
164
|
_log [ :message_error, exc ]
|
@@ -175,6 +177,8 @@ module ASIR
|
|
175
177
|
send_result(state)
|
176
178
|
end
|
177
179
|
end
|
180
|
+
rescue *Error::Unrecoverable.modules
|
181
|
+
raise
|
178
182
|
rescue ::Exception => exc
|
179
183
|
_log [ :result_error, exc, exc.backtrace ]
|
180
184
|
@on_exception.call(self, exc, :result, state) if @on_exception
|
@@ -14,6 +14,8 @@ module ASIR
|
|
14
14
|
transports.each do | transport |
|
15
15
|
begin
|
16
16
|
result = transport.send_message(state.message)
|
17
|
+
rescue *Error::Unrecoverable.modules
|
18
|
+
raise
|
17
19
|
rescue ::Exception => exc
|
18
20
|
first_exception ||= exc
|
19
21
|
_handle_send_message_exception! transport, state, exc
|
data/lib/asir/transport/file.rb
CHANGED
@@ -1,39 +1,79 @@
|
|
1
1
|
require 'asir/transport/stream'
|
2
2
|
require 'asir/transport/payload_io'
|
3
|
+
require 'asir/fifo'
|
3
4
|
|
4
5
|
module ASIR
|
5
6
|
class Transport
|
6
7
|
# !SLIDE
|
7
8
|
# File Transport
|
8
9
|
#
|
9
|
-
# Send Message
|
10
|
+
# Send Message to a file.
|
10
11
|
# Can be used as a log or named pipe service.
|
11
12
|
class File < Stream
|
12
13
|
include PayloadIO # _write, _read
|
13
14
|
attr_accessor :file, :mode, :perms, :stream
|
15
|
+
attr_accessor :result_file, :result_fifo
|
14
16
|
|
15
17
|
def initialize opts = nil; @one_way = true; super; end
|
16
18
|
|
17
|
-
#
|
19
|
+
# If not one_way, create a result_file fifo.
|
20
|
+
def send_message message
|
21
|
+
unless one_way || message.one_way
|
22
|
+
result_file =
|
23
|
+
message[:result_file] ||=
|
24
|
+
self.result_file ||
|
25
|
+
begin
|
26
|
+
message.create_identifier!
|
27
|
+
"#{self.file}-result-#{message.identifier}"
|
28
|
+
end
|
29
|
+
unless ::File.exist?(result_file) and result_fifo
|
30
|
+
::ASIR::Fifo.mkfifo(result_file, perms)
|
31
|
+
message[:result_file_created] = true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
super
|
35
|
+
ensure
|
36
|
+
if message[:result_file_created]
|
37
|
+
::File.unlink(result_file) rescue nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
18
41
|
def _send_message state
|
19
42
|
_write(state.message_payload, state.out_stream || stream, state)
|
20
43
|
ensure
|
21
44
|
close if file && ::File.pipe?(file)
|
22
45
|
end
|
23
46
|
|
24
|
-
# Returns a Message payload String.
|
25
47
|
def _receive_message state
|
26
48
|
state.message_payload = _read(state.in_stream || stream, state)
|
27
49
|
end
|
28
50
|
|
29
|
-
#
|
51
|
+
# Send result to result_file.
|
30
52
|
def _send_result state
|
31
|
-
|
53
|
+
unless one_way || (message = state.message).one_way
|
54
|
+
if result_file = message[:result_file] || self.result_file
|
55
|
+
::File.open(result_file, "a+") do | stream |
|
56
|
+
_write(state.result_payload, stream, state)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
32
60
|
end
|
33
61
|
|
34
|
-
#
|
62
|
+
# Receive result from result_file.
|
35
63
|
def _receive_result state
|
36
|
-
|
64
|
+
message = state.message
|
65
|
+
result_file = message[:result_file] || self.result_file
|
66
|
+
unless one_way || message.one_way
|
67
|
+
if result_file
|
68
|
+
::File.open(result_file, "r") do | stream |
|
69
|
+
state.result_payload = _read(stream, state)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def needs_message_identifier? m
|
76
|
+
@needs_message_identifier || ! one_way || ! m.one_way
|
37
77
|
end
|
38
78
|
|
39
79
|
# !SLIDE
|
@@ -55,7 +95,7 @@ module ASIR
|
|
55
95
|
def serve_file!
|
56
96
|
::File.open(file, "r") do | stream |
|
57
97
|
@running = true
|
58
|
-
_serve_stream! stream,
|
98
|
+
_serve_stream! stream, ! one_way
|
59
99
|
end
|
60
100
|
end
|
61
101
|
|
@@ -64,8 +104,7 @@ module ASIR
|
|
64
104
|
|
65
105
|
def prepare_server!
|
66
106
|
unless ::File.exist? file
|
67
|
-
|
68
|
-
::File.chmod(perms, file) rescue nil if perms
|
107
|
+
::ASIR::Fifo.mkfifo(file, perms)
|
69
108
|
end
|
70
109
|
end
|
71
110
|
alias :prepare_pipe_server! :prepare_server!
|
data/lib/asir/uuid.rb
CHANGED
@@ -50,14 +50,14 @@ module UUID
|
|
50
50
|
end
|
51
51
|
@@counter ||= 0
|
52
52
|
@@counter_mutex = Mutex.new
|
53
|
-
COUNTER_UUID_REGEX = /\A[0-9]
|
53
|
+
COUNTER_UUID_REGEX = /\A([0-9]+)-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\Z/i
|
54
54
|
|
55
55
|
# Returns a unique counter_uuid for a Thread.
|
56
56
|
# thr defaults to Thread.current.
|
57
57
|
def thread_uuid thr = nil
|
58
58
|
thr ||= Thread.current
|
59
|
-
|
60
|
-
thr[:'ASIR::UUID.thread_uuid']
|
59
|
+
@@thread_uuid_mutex.synchronize do
|
60
|
+
thr[:'ASIR::UUID.thread_uuid'] ||= counter_uuid
|
61
61
|
end
|
62
62
|
end
|
63
63
|
@@thread_uuid_mutex = Mutex.new
|
data/lib/asir/version.rb
CHANGED
data/spec/example_spec.rb
CHANGED
@@ -2,20 +2,30 @@ require File.expand_path('../spec_helper', __FILE__)
|
|
2
2
|
|
3
3
|
$:.unshift File.expand_path('../../example', __FILE__)
|
4
4
|
|
5
|
+
require 'timeout'
|
6
|
+
|
7
|
+
class ASIR::Error::TestTimeout < ASIR::Error::Fatal; end
|
8
|
+
|
5
9
|
describe "ASIR Example" do
|
6
10
|
attr_accessor :file, :expects
|
7
11
|
|
8
12
|
before(:each) do
|
9
13
|
@expects = [ ]
|
14
|
+
@verbose = (ENV['SPEC_VERBOSE'] || 0).to_i
|
10
15
|
end
|
11
16
|
|
12
|
-
|
13
|
-
@file
|
17
|
+
def file! file
|
18
|
+
@file = file
|
14
19
|
File.open(@file) do | fh |
|
15
20
|
until fh.eof?
|
16
21
|
line = fh.readline
|
17
22
|
line.chomp!
|
18
23
|
case
|
24
|
+
when line.sub!(/^\s*#\s*PENDING:\s*/, '')
|
25
|
+
line.strip!
|
26
|
+
@pending_reason = line
|
27
|
+
@pending = ! ! (eval(line) rescue nil)
|
28
|
+
# $stderr.puts " PENDING #{@pending_reason.inspect} => #{@pending.inspect}" if ENV['SPEC_VERBOSE']
|
19
29
|
when line.sub!(/^\s*#\s*EXPECT\/:\s*/, '')
|
20
30
|
expect Regexp.new(line)
|
21
31
|
when line.sub!(/^\s*#\s*EXPECT!\/:\s*/, '')
|
@@ -27,11 +37,23 @@ describe "ASIR Example" do
|
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
40
|
+
|
30
41
|
@output, @exit_code = run_file!(@file)
|
42
|
+
|
43
|
+
if @pending
|
44
|
+
pending @pending_reason do
|
45
|
+
check_result!
|
46
|
+
end
|
47
|
+
else
|
48
|
+
check_result!
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_result!
|
31
53
|
@exit_code.should == 0
|
32
54
|
@expects.empty?.should_not == true
|
33
55
|
@expects.each do | rx, mode |
|
34
|
-
$stderr.puts " Checking #{mode} #{rx.inspect}" if
|
56
|
+
$stderr.puts " Checking #{mode} #{rx.inspect}" if @verbose >= 2
|
35
57
|
case mode
|
36
58
|
when :'=~'
|
37
59
|
@output.should =~ rx
|
@@ -43,31 +65,36 @@ describe "ASIR Example" do
|
|
43
65
|
end
|
44
66
|
end
|
45
67
|
|
46
|
-
def run_file! file
|
68
|
+
def run_file! file
|
69
|
+
output = nil
|
70
|
+
output_file = "#{file}.out"
|
47
71
|
progname_save, stdout_save, stderr_save = $0, $stdout, $stderr
|
72
|
+
ruby = ASIR.ruby_path
|
48
73
|
exc = system_exit = nil; exit_code = 0
|
49
74
|
begin
|
50
|
-
|
51
|
-
cmd = "ASIR_EXAMPLE_SILENT=1 ruby -I example -I lib #{file}"
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
$0 = file
|
59
|
-
Kernel.load(file, true)
|
60
|
-
output = output.string if StringIO === output
|
75
|
+
Timeout.timeout(20, ASIR::Error::TestTimeout) do
|
76
|
+
cmd = "ASIR_EXAMPLE_SILENT=1 #{ruby.inspect} -I example -I lib #{file}"
|
77
|
+
if @verbose >= 1
|
78
|
+
$stderr.puts "\n Running #{cmd}:"
|
79
|
+
$stderr.puts "\n -- #{@title}" if @title
|
80
|
+
end
|
81
|
+
File.unlink(output_file) rescue nil
|
82
|
+
system("#{cmd} >#{output_file} 2>&1")
|
61
83
|
end
|
84
|
+
rescue ASIR::Error::TestTimeout
|
85
|
+
$stderr.puts " Warning: Timeout in #{@file}"
|
86
|
+
exit_code = 0 # OK if checks pass
|
62
87
|
rescue ::SystemExit => system_exit
|
63
88
|
exit_code = 1 # ???
|
64
89
|
rescue ::Exception => exc
|
65
90
|
exit_code = -1
|
66
91
|
end
|
92
|
+
output = File.read(output_file)
|
67
93
|
[ output, exit_code ]
|
68
94
|
ensure
|
69
95
|
$0, $stdout, $stderr = progname_save, stdout_save, stderr_save
|
70
|
-
|
96
|
+
output ||= File.read(output_file)
|
97
|
+
$stderr.write output if @verbose >= 1
|
71
98
|
if exc
|
72
99
|
stderr_save.puts "ERROR: #{file}: #{exc.inspect}\n#{exc.backtrace * "\n"}"
|
73
100
|
raise exc
|
@@ -82,7 +109,8 @@ describe "ASIR Example" do
|
|
82
109
|
title = File.open(file) { | fh | fh.read(4096) }
|
83
110
|
title = title =~ /#\s+!SLIDE[^\n]*\n\s*#\s*([^\n]+)/ && $1
|
84
111
|
it "#{file} - #{title}" do
|
85
|
-
@
|
112
|
+
@title = title
|
113
|
+
file! file
|
86
114
|
end
|
87
115
|
end
|
88
116
|
end
|
data/spec/yaml_spec.rb
CHANGED
@@ -19,16 +19,19 @@ describe "ASIR::Coder::Yaml" do
|
|
19
19
|
[ :Symbol, ':Symbol' ],
|
20
20
|
].each do | x |
|
21
21
|
x, str = *x
|
22
|
-
if x == nil
|
23
|
-
|
22
|
+
if x == nil
|
23
|
+
if RUBY_VERSION == '1.9.2'
|
24
|
+
str = '!!null '
|
25
|
+
end
|
24
26
|
end
|
25
27
|
str ||= x.to_s
|
26
|
-
|
27
|
-
|
28
|
+
unless x == nil and RUBY_VERSION !~ /^1\.8/ and RUBY_ENGINE =~ /jruby/i
|
29
|
+
str = " #{str}"
|
30
|
+
end
|
28
31
|
basic_objs << [ x, str ]
|
29
32
|
it "should handle #{x.inspect}" do
|
30
33
|
out = @enc.prepare.encode(x)
|
31
|
-
out.should
|
34
|
+
out.should =~ /\A---#{str} ?\n(\.\.\.\n)?\Z/
|
32
35
|
@dec.prepare.decode(out).should == x
|
33
36
|
end
|
34
37
|
end
|
@@ -43,7 +46,7 @@ describe "ASIR::Coder::Yaml" do
|
|
43
46
|
when '1.9.2'
|
44
47
|
out.should =~ /^ :binary: |-\n/m
|
45
48
|
else
|
46
|
-
out.should =~ /^ :binary: ! "\\x04/m
|
49
|
+
out.should =~ /^ :binary: (! )?"\\x04/m
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
@@ -78,6 +81,10 @@ describe "ASIR::Coder::Yaml" do
|
|
78
81
|
require 'socket'
|
79
82
|
hostname = Socket.gethostname
|
80
83
|
enc = hostname.encoding
|
84
|
+
if enc.inspect != "#<Encoding:ASCII-8BIT>" # JRUBY?
|
85
|
+
hostname.force_encoding('ASCII-8BIT')
|
86
|
+
enc = hostname.encoding
|
87
|
+
end
|
81
88
|
enc.inspect.should == "#<Encoding:ASCII-8BIT>"
|
82
89
|
|
83
90
|
str = enc.inspect
|
@@ -93,7 +100,7 @@ describe "ASIR::Coder::Yaml" do
|
|
93
100
|
end
|
94
101
|
|
95
102
|
yaml = ::YAML.dump(str, nil, :never_binary => true)
|
96
|
-
yaml.should
|
103
|
+
yaml.should =~ /\A--- (! )?['"]\#<Encoding:ASCII-8BIT>['"]\n/
|
97
104
|
end
|
98
105
|
|
99
106
|
it 'should handle :never_binary options.' do
|
@@ -103,7 +110,12 @@ describe "ASIR::Coder::Yaml" do
|
|
103
110
|
out = @enc.prepare.encode(str)
|
104
111
|
case RUBY_VERSION
|
105
112
|
when '1.9.2'
|
106
|
-
|
113
|
+
case RUBY_ENGINE
|
114
|
+
when /jruby/i
|
115
|
+
out.should == "--- 8bitascii\n"
|
116
|
+
else
|
117
|
+
out.should == "--- 8bitascii\n...\n"
|
118
|
+
end
|
107
119
|
else
|
108
120
|
out.should == "--- !binary |-\n OGJpdGFzY2lp\n"
|
109
121
|
end
|
@@ -112,7 +124,12 @@ describe "ASIR::Coder::Yaml" do
|
|
112
124
|
@enc.yaml_options = { :never_binary => true }
|
113
125
|
@dec.yaml_options = @enc.yaml_options
|
114
126
|
out = @enc.prepare.encode(str)
|
115
|
-
|
127
|
+
case RUBY_ENGINE
|
128
|
+
when /jruby/i
|
129
|
+
out.should == "--- 8bitascii\n"
|
130
|
+
else
|
131
|
+
out.should == "--- 8bitascii\n...\n"
|
132
|
+
end
|
116
133
|
inp = @dec.prepare.decode(str)
|
117
134
|
inp.should == str
|
118
135
|
inp.encoding.inspect.should == "#<Encoding:UTF-8>"
|
metadata
CHANGED
@@ -1,120 +1,114 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: asir
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 2
|
8
|
+
- 2
|
9
|
+
version: 1.2.2
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Kurt Stephens
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 2.3.6
|
16
|
+
|
17
|
+
date: 2012-12-31 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
22
21
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
27
24
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
segments:
|
27
|
+
- 2
|
28
|
+
- 3
|
29
|
+
- 6
|
29
30
|
version: 2.3.6
|
30
|
-
|
31
|
-
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 2.3.0
|
38
|
-
type: :runtime
|
31
|
+
name: uuid
|
32
|
+
requirement: *id001
|
39
33
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
43
38
|
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
segments:
|
41
|
+
- 2
|
42
|
+
- 3
|
43
|
+
- 0
|
45
44
|
version: 2.3.0
|
46
|
-
|
47
|
-
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ~>
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.4.1
|
54
|
-
type: :runtime
|
45
|
+
name: httpclient
|
46
|
+
requirement: *id002
|
55
47
|
prerelease: false
|
56
|
-
|
57
|
-
|
58
|
-
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
59
52
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 1
|
56
|
+
- 4
|
57
|
+
- 1
|
61
58
|
version: 1.4.1
|
62
|
-
|
63
|
-
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 0.9.0
|
70
|
-
type: :development
|
59
|
+
name: rack
|
60
|
+
requirement: *id003
|
71
61
|
prerelease: false
|
72
|
-
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 0.9.0
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: rspec
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 2.12.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
86
63
|
type: :development
|
64
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
- 9
|
71
|
+
- 0
|
72
|
+
version: 0.9.0
|
73
|
+
name: rake
|
74
|
+
requirement: *id004
|
87
75
|
prerelease: false
|
88
|
-
|
89
|
-
|
90
|
-
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
type: :development
|
78
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
91
80
|
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 2
|
84
|
+
- 12
|
85
|
+
- 0
|
93
86
|
version: 2.12.0
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0.1'
|
87
|
+
name: rspec
|
88
|
+
requirement: *id005
|
89
|
+
prerelease: false
|
90
|
+
- !ruby/object:Gem::Dependency
|
102
91
|
type: :development
|
92
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
- 1
|
99
|
+
version: "0.1"
|
100
|
+
name: simplecov
|
101
|
+
requirement: *id006
|
103
102
|
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0.1'
|
110
103
|
description: Abstracting Services in Ruby
|
111
104
|
email: ks.ruby@kurtstephens.com
|
112
|
-
executables:
|
105
|
+
executables:
|
113
106
|
- asir
|
114
107
|
extensions: []
|
115
|
-
|
108
|
+
|
109
|
+
extra_rdoc_files:
|
116
110
|
- README.textile
|
117
|
-
files:
|
111
|
+
files:
|
118
112
|
- .gitignore
|
119
113
|
- .rspec
|
120
114
|
- .travis.yml
|
@@ -148,6 +142,7 @@ files:
|
|
148
142
|
- example/ex13.rb
|
149
143
|
- example/ex14.rb
|
150
144
|
- example/ex15.rb
|
145
|
+
- example/ex16.rb
|
151
146
|
- example/ex18.rb
|
152
147
|
- example/ex19.rb
|
153
148
|
- example/ex22.rb
|
@@ -175,8 +170,10 @@ files:
|
|
175
170
|
- hack_night/solution/prob-7.rb
|
176
171
|
- lab/const_get_speed_spec.rb
|
177
172
|
- lab/phony_proc.rb
|
173
|
+
- lab/spoon_test.rb
|
178
174
|
- lib/asir.rb
|
179
175
|
- lib/asir/additional_data.rb
|
176
|
+
- lib/asir/application.rb
|
180
177
|
- lib/asir/channel.rb
|
181
178
|
- lib/asir/client.rb
|
182
179
|
- lib/asir/code_block.rb
|
@@ -197,6 +194,7 @@ files:
|
|
197
194
|
- lib/asir/description.rb
|
198
195
|
- lib/asir/environment.rb
|
199
196
|
- lib/asir/error.rb
|
197
|
+
- lib/asir/fifo.rb
|
200
198
|
- lib/asir/identity.rb
|
201
199
|
- lib/asir/initialization.rb
|
202
200
|
- lib/asir/invoker.rb
|
@@ -209,6 +207,7 @@ files:
|
|
209
207
|
- lib/asir/poll_throttle.rb
|
210
208
|
- lib/asir/result.rb
|
211
209
|
- lib/asir/retry_behavior.rb
|
210
|
+
- lib/asir/system.rb
|
212
211
|
- lib/asir/thread_pool.rb
|
213
212
|
- lib/asir/thread_variable.rb
|
214
213
|
- lib/asir/transport.rb
|
@@ -250,32 +249,37 @@ files:
|
|
250
249
|
- spec/uuid_spec.rb
|
251
250
|
- spec/yaml_spec.rb
|
252
251
|
- stylesheets/slides.css
|
252
|
+
has_rdoc: true
|
253
253
|
homepage: http://github.com/kstephens/abstracting_services_in_ruby
|
254
254
|
licenses: []
|
255
|
+
|
255
256
|
post_install_message:
|
256
|
-
rdoc_options:
|
257
|
+
rdoc_options:
|
257
258
|
- --charset=UTF-8
|
258
|
-
require_paths:
|
259
|
+
require_paths:
|
259
260
|
- lib
|
260
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
requirements:
|
269
|
-
- -
|
270
|
-
- !ruby/object:Gem::Version
|
271
|
-
|
261
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
262
|
+
requirements:
|
263
|
+
- - ">="
|
264
|
+
- !ruby/object:Gem::Version
|
265
|
+
segments:
|
266
|
+
- 0
|
267
|
+
version: "0"
|
268
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
+
requirements:
|
270
|
+
- - ">="
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
segments:
|
273
|
+
- 0
|
274
|
+
version: "0"
|
272
275
|
requirements: []
|
276
|
+
|
273
277
|
rubyforge_project:
|
274
|
-
rubygems_version: 1.
|
278
|
+
rubygems_version: 1.3.6
|
275
279
|
signing_key:
|
276
280
|
specification_version: 3
|
277
281
|
summary: Abstracting Services in Ruby
|
278
|
-
test_files:
|
282
|
+
test_files:
|
279
283
|
- spec/client_spec.rb
|
280
284
|
- spec/debug_helper.rb
|
281
285
|
- spec/demux_spec.rb
|