rake-subproject 0.0.6 → 0.0.9
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 +5 -13
- data/Rakefile +7 -3
- data/lib/rake/subproject/client/port.rb +50 -48
- data/lib/rake/subproject/client/session.rb +23 -21
- data/lib/rake/subproject/client/session_manager.rb +94 -92
- data/lib/rake/subproject/ext/application.rb +1 -1
- data/lib/rake/subproject/ext/dsl.rb +34 -0
- data/lib/rake/subproject/server/port.rb +50 -48
- data/lib/rake/subproject/server/session.rb +23 -21
- data/lib/rake/subproject/server/session_manager.rb +94 -92
- data/lib/rake/subproject/server/task.rb +2 -2
- data/lib/rake/subproject/task_manager.rb +1 -1
- data/lib/rake/subproject/task_runner.rb +1 -1
- data/lib/rake/subproject/version.rb +1 -1
- data/rake-subproject.gemspec +2 -2
- data/spec/rake/subproject_spec.rb +4 -5
- data/spec/spec_helper.rb +2 -0
- data/spec/support/exceptions/Rakefile +5 -0
- data/spec/support/exceptions/foo/Rakefile +6 -0
- data/spec/support/exceptions/foo/bar/Rakefile +4 -0
- metadata +17 -11
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZTg4OTI4NTQzNzE5MzNhOGU4YzljM2YxZTExOTY2NzQwOWJlMjJiNw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a494a9b42330ff16a6b7f9f4e8f09eb1a1b29ccf
|
4
|
+
data.tar.gz: 6fcb305263de9491d6179479fa2bf1605f396814
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NmZmMjRmYmUzNGFkZTA0NjgzZjhlMmY0M2Y4ZmEyYjYxMDYwM2JiOWJiYmU1
|
11
|
-
NTI5N2FlNGRlNjZiYjY3ODk5Mzc0ODNiZjI0OGIyZjFkMWFmNzA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZTNlZjVlNmYxZmMxMzkwYTZjY2E5YzVmMzJkYjY2MWM1ZDU2MWU3ZTQ5ZjU1
|
14
|
-
MmMzYjZjNjM0NWQ1MTFlNzgwMzQ5YzU2NzVmYWNmYzdlZjBjZGRiNGM5NjA2
|
15
|
-
NjU3ZTA2ZjVkYzkzNTgyZmExOGYyMmM2ODlmOGQwNDZhMjI0MmI=
|
6
|
+
metadata.gz: 94f7057912fef453ab7413271c4b22d9bf0ecc374782bab64e33f1f1f02c56d57c55f28e12945e69b807f5610bafc9aec8a61a53337cbf1d4500f45afd9c6543
|
7
|
+
data.tar.gz: db6123de5ee1dfcee7f0864930530563775cf567b262de8ec5ed25f1b434084a2ffd5d99346d7efccc7c5d17386a5bcc52f0ce08d8a925dc9e0a29db49930e28
|
data/Rakefile
CHANGED
@@ -13,11 +13,15 @@ task :default => :spec
|
|
13
13
|
FileList["resources/network/*.rb"].each do |path|
|
14
14
|
file "#{dir}/#{File.basename(path)}" => "lib/rake/subproject/#{name.downcase}" do |t|
|
15
15
|
File.open(t.name, 'w') do |f|
|
16
|
-
f.puts
|
17
|
-
|
18
|
-
|
16
|
+
f.puts <<END
|
17
|
+
module Rake::Subproject
|
18
|
+
module #{name} #:nodoc: all
|
19
|
+
#{File.read(path)} end
|
20
|
+
end
|
21
|
+
END
|
19
22
|
end
|
20
23
|
end
|
24
|
+
|
21
25
|
namespace :build do
|
22
26
|
task :library => "#{dir}/#{File.basename(path)}"
|
23
27
|
end
|
@@ -1,52 +1,54 @@
|
|
1
|
-
module Rake
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
def self.open(fd, option)
|
6
|
-
return unless block_given?
|
7
|
-
IO.open(fd, option) do |io|
|
8
|
-
yield port = self.new(io, "server")
|
9
|
-
end
|
10
|
-
end
|
1
|
+
module Rake::Subproject
|
2
|
+
module Client #:nodoc: all
|
3
|
+
class Port #:nodoc: all
|
4
|
+
attr_accessor :name
|
11
5
|
|
12
|
-
|
6
|
+
def self.open(fd, option)
|
7
|
+
return unless block_given?
|
8
|
+
IO.open(fd, option) do |io|
|
9
|
+
yield port = self.new(io, "server")
|
10
|
+
end
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
13
|
+
DELIMITER = "\0"
|
14
|
+
|
15
|
+
def initialize(io, name = nil)
|
16
|
+
fail ArgumentError, "Requires an IO object" unless io.kind_of?(IO)
|
17
|
+
@io = io
|
18
|
+
self.name = name
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"Port(#{self.name || @io.fileno})"
|
23
|
+
end
|
24
|
+
|
25
|
+
def read
|
26
|
+
log "reading #{self.inspect}..."
|
27
|
+
json_message = @io.readline(DELIMITER).chomp(DELIMITER)
|
28
|
+
log "... #{self.inspect} received: #{json_message}"
|
29
|
+
::JSON.parse(json_message)
|
30
|
+
end
|
31
|
+
|
32
|
+
def write(object)
|
33
|
+
json_message = ::JSON.generate(object)
|
34
|
+
@io.print(json_message+DELIMITER)
|
35
|
+
@io.flush
|
36
|
+
log "#{self.inspect} wrote: #{json_message}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def close
|
40
|
+
log "closing #{self.inspect}"
|
41
|
+
@io.close
|
42
|
+
end
|
43
|
+
|
44
|
+
def closed?
|
45
|
+
@io.closed?
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def log(message)
|
50
|
+
$stderr.print "#{message}\n" if false
|
51
|
+
end
|
52
|
+
end
|
50
53
|
end
|
51
54
|
end
|
52
|
-
end ; end ; end
|
@@ -1,24 +1,26 @@
|
|
1
|
-
module Rake
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def id
|
9
|
-
@id || object_id
|
10
|
-
end
|
11
|
-
|
12
|
-
def write(object)
|
13
|
-
@manager.send(:write_session, self, object)
|
14
|
-
end
|
1
|
+
module Rake::Subproject
|
2
|
+
module Client #:nodoc: all
|
3
|
+
class Session #:nodoc: all
|
4
|
+
def initialize(manager, id = nil)
|
5
|
+
@id = id
|
6
|
+
@manager = manager
|
7
|
+
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
def id
|
10
|
+
@id || object_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(object)
|
14
|
+
@manager.send(:write_session, self, object)
|
15
|
+
end
|
16
|
+
|
17
|
+
def read
|
18
|
+
@manager.send(:read_session, self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def close
|
22
|
+
@manager.send(:close_session, self)
|
23
|
+
end
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
24
|
-
end ; end ; end
|
@@ -1,101 +1,103 @@
|
|
1
|
-
module Rake
|
2
|
-
|
1
|
+
module Rake::Subproject
|
2
|
+
module Client #:nodoc: all
|
3
|
+
class SessionManager #:nodoc: all
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
def initialize(port)
|
6
|
+
fail ArgumentError, "Requires a Port object" unless port.kind_of?(Port)
|
7
|
+
@port = port
|
8
|
+
@session_queues = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.with_each_session(port, &block)
|
12
|
+
return unless block_given?
|
13
|
+
session_manager = self.new(port)
|
14
|
+
threads = Set.new
|
15
|
+
mutex = Mutex.new
|
16
|
+
session_manager.start do |session|
|
17
|
+
mutex.synchronize do
|
18
|
+
threads << thread = Thread.start do
|
19
|
+
block.call(session)
|
20
|
+
mutex.synchronize { threads.delete thread }
|
21
|
+
end
|
22
|
+
end
|
20
23
|
end
|
24
|
+
ensure
|
25
|
+
log "Waiting for #{threads.count} threads"
|
26
|
+
mutex.synchronize { threads.dup }.each(&:join)
|
27
|
+
session_manager.close
|
28
|
+
end
|
29
|
+
|
30
|
+
def start(&block)
|
31
|
+
log "starting read loop on #{@port.inspect}"
|
32
|
+
loop do
|
33
|
+
envelope = @port.read
|
34
|
+
fail "no 'message' tag in envelope" if (message = envelope['message']).nil?
|
35
|
+
fail "no 'session_id' tag in envelope" if (session_id = envelope['session_id']).nil? || session_id == "0"
|
36
|
+
session_id = session_id.to_i
|
37
|
+
fail "null(0) 'session_id' tag in envelope" if session_id == 0
|
38
|
+
|
39
|
+
case message
|
40
|
+
when 'create_session'
|
41
|
+
session = Session.new(self, session_id.to_i)
|
42
|
+
@session_queues[session.id] = Queue.new
|
43
|
+
block.call(session) unless block.nil?
|
44
|
+
when 'message_session'
|
45
|
+
fail "No session for #{session_id.to_i}" if (queue = @session_queues[session_id.to_i]).nil?
|
46
|
+
queue << envelope['payload']
|
47
|
+
else
|
48
|
+
fail "did not recognize message: '#{message}'" if (session_id = envelope['session_id']).nil? || session_id == 0
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
rescue EOFError => e
|
53
|
+
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
54
|
+
rescue IOError => e
|
55
|
+
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
56
|
+
# raise
|
57
|
+
end
|
58
|
+
|
59
|
+
def with_session
|
60
|
+
return unless block_given?
|
61
|
+
yield session = create_session
|
62
|
+
ensure
|
63
|
+
session.close unless session.nil?
|
21
64
|
end
|
22
|
-
end
|
23
|
-
ensure
|
24
|
-
log "Waiting for #{threads.count} threads"
|
25
|
-
mutex.synchronize { threads.dup }.each(&:join)
|
26
|
-
session_manager.close
|
27
|
-
end
|
28
|
-
|
29
|
-
def start(&block)
|
30
|
-
log "starting read loop on #{@port.inspect}"
|
31
|
-
loop do
|
32
|
-
envelope = @port.read
|
33
|
-
fail "no 'message' tag in envelope" if (message = envelope['message']).nil?
|
34
|
-
fail "no 'session_id' tag in envelope" if (session_id = envelope['session_id']).nil? || session_id == "0"
|
35
|
-
session_id = session_id.to_i
|
36
|
-
fail "null(0) 'session_id' tag in envelope" if session_id == 0
|
37
65
|
|
38
|
-
|
39
|
-
|
40
|
-
|
66
|
+
def create_session
|
67
|
+
session = Session.send(:new, self)
|
68
|
+
@port.write(message: 'create_session', session_id: session.id)
|
41
69
|
@session_queues[session.id] = Queue.new
|
42
|
-
|
43
|
-
when 'message_session'
|
44
|
-
fail "No session for #{session_id.to_i}" if (queue = @session_queues[session_id.to_i]).nil?
|
45
|
-
queue << envelope['payload']
|
46
|
-
else
|
47
|
-
fail "did not recognize message: '#{message}'" if (session_id = envelope['session_id']).nil? || session_id == 0
|
70
|
+
session
|
48
71
|
end
|
49
|
-
|
50
|
-
end
|
51
|
-
rescue EOFError => e
|
52
|
-
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
53
|
-
rescue IOError => e
|
54
|
-
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
55
|
-
# raise
|
56
|
-
end
|
57
|
-
|
58
|
-
def with_session
|
59
|
-
return unless block_given?
|
60
|
-
yield session = create_session
|
61
|
-
ensure
|
62
|
-
session.close unless session.nil?
|
63
|
-
end
|
64
|
-
|
65
|
-
def create_session
|
66
|
-
session = Session.send(:new, self)
|
67
|
-
@port.write(message: 'create_session', session_id: session.id)
|
68
|
-
@session_queues[session.id] = Queue.new
|
69
|
-
session
|
70
|
-
end
|
71
|
-
|
72
|
-
def close
|
73
|
-
log "session manager: closing #{@port.inspect}"
|
74
|
-
end
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
73
|
+
def close
|
74
|
+
log "session manager: closing #{@port.inspect}"
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def close_session(session)
|
80
|
+
log "closing session: #{session.id} on #{@port.inspect}"
|
81
|
+
@session_queues.delete(session.id)
|
82
|
+
end
|
83
|
+
|
84
|
+
def read_session(session)
|
85
|
+
fail "No queue for #{session.inspect}" if (queue = @session_queues[session.id]).nil?
|
86
|
+
fail EOFError if queue.empty? && @port.closed?
|
87
|
+
queue.pop
|
88
|
+
end
|
89
|
+
|
90
|
+
def write_session(session, object)
|
91
|
+
@port.write(message: 'message_session', session_id: session.id, payload: object)
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
def self.log(message)
|
96
|
+
$stderr.print "#{message}\n" if false
|
97
|
+
end
|
98
|
+
def log(message)
|
99
|
+
self.class.log(message)
|
100
|
+
end
|
101
|
+
end
|
99
102
|
end
|
100
103
|
end
|
101
|
-
end ; end ; end
|
@@ -1,4 +1,38 @@
|
|
1
1
|
module Rake::DSL
|
2
|
+
# Bridges the subproject's tasks to within the current Rakefile.
|
3
|
+
# Tasks from the sub-project can be referenced in the super-project by
|
4
|
+
# prefixing the sub-project task with the namespace of its containing directory.
|
5
|
+
#
|
6
|
+
# For example, given a project in a subdirectory, '+foo+':
|
7
|
+
#
|
8
|
+
# +foo/Rakefile+:
|
9
|
+
# task :bar
|
10
|
+
#
|
11
|
+
# The super project can include it via the #subproject call and reference the
|
12
|
+
# subproject's tasks via a namespace or via a path:
|
13
|
+
#
|
14
|
+
# +Rakefile+:
|
15
|
+
#
|
16
|
+
# require 'rake/subproject'
|
17
|
+
#
|
18
|
+
# subproject 'foo'
|
19
|
+
#
|
20
|
+
# task :first => foo:bar # valid reference
|
21
|
+
# task :second => foo/bar # valid reference
|
22
|
+
#
|
23
|
+
# The +path+ parameter can be either a *directory* containing a valid Rakefile or a path
|
24
|
+
# to a specific *file*.
|
25
|
+
#
|
26
|
+
# Given a directory::
|
27
|
+
#
|
28
|
+
# It cannot be to a subdirectory whose superdirectory contains a Rakefile. The
|
29
|
+
# subdirectory itself must contain the Rakefile. The namespace is
|
30
|
+
# generated from the directory path.
|
31
|
+
#
|
32
|
+
# Given a file::
|
33
|
+
#
|
34
|
+
# The namespace is generated from the directory containing the file.
|
35
|
+
#
|
2
36
|
def subproject(path)
|
3
37
|
Rake.application.define_subproject(path)
|
4
38
|
end
|
@@ -1,52 +1,54 @@
|
|
1
|
-
module Rake
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
def self.open(fd, option)
|
6
|
-
return unless block_given?
|
7
|
-
IO.open(fd, option) do |io|
|
8
|
-
yield port = self.new(io, "server")
|
9
|
-
end
|
10
|
-
end
|
1
|
+
module Rake::Subproject
|
2
|
+
module Server #:nodoc: all
|
3
|
+
class Port #:nodoc: all
|
4
|
+
attr_accessor :name
|
11
5
|
|
12
|
-
|
6
|
+
def self.open(fd, option)
|
7
|
+
return unless block_given?
|
8
|
+
IO.open(fd, option) do |io|
|
9
|
+
yield port = self.new(io, "server")
|
10
|
+
end
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
13
|
+
DELIMITER = "\0"
|
14
|
+
|
15
|
+
def initialize(io, name = nil)
|
16
|
+
fail ArgumentError, "Requires an IO object" unless io.kind_of?(IO)
|
17
|
+
@io = io
|
18
|
+
self.name = name
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"Port(#{self.name || @io.fileno})"
|
23
|
+
end
|
24
|
+
|
25
|
+
def read
|
26
|
+
log "reading #{self.inspect}..."
|
27
|
+
json_message = @io.readline(DELIMITER).chomp(DELIMITER)
|
28
|
+
log "... #{self.inspect} received: #{json_message}"
|
29
|
+
::JSON.parse(json_message)
|
30
|
+
end
|
31
|
+
|
32
|
+
def write(object)
|
33
|
+
json_message = ::JSON.generate(object)
|
34
|
+
@io.print(json_message+DELIMITER)
|
35
|
+
@io.flush
|
36
|
+
log "#{self.inspect} wrote: #{json_message}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def close
|
40
|
+
log "closing #{self.inspect}"
|
41
|
+
@io.close
|
42
|
+
end
|
43
|
+
|
44
|
+
def closed?
|
45
|
+
@io.closed?
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def log(message)
|
50
|
+
$stderr.print "#{message}\n" if false
|
51
|
+
end
|
52
|
+
end
|
50
53
|
end
|
51
54
|
end
|
52
|
-
end ; end ; end
|
@@ -1,24 +1,26 @@
|
|
1
|
-
module Rake
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def id
|
9
|
-
@id || object_id
|
10
|
-
end
|
11
|
-
|
12
|
-
def write(object)
|
13
|
-
@manager.send(:write_session, self, object)
|
14
|
-
end
|
1
|
+
module Rake::Subproject
|
2
|
+
module Server #:nodoc: all
|
3
|
+
class Session #:nodoc: all
|
4
|
+
def initialize(manager, id = nil)
|
5
|
+
@id = id
|
6
|
+
@manager = manager
|
7
|
+
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
def id
|
10
|
+
@id || object_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(object)
|
14
|
+
@manager.send(:write_session, self, object)
|
15
|
+
end
|
16
|
+
|
17
|
+
def read
|
18
|
+
@manager.send(:read_session, self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def close
|
22
|
+
@manager.send(:close_session, self)
|
23
|
+
end
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
24
|
-
end ; end ; end
|
@@ -1,101 +1,103 @@
|
|
1
|
-
module Rake
|
2
|
-
|
1
|
+
module Rake::Subproject
|
2
|
+
module Server #:nodoc: all
|
3
|
+
class SessionManager #:nodoc: all
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
def initialize(port)
|
6
|
+
fail ArgumentError, "Requires a Port object" unless port.kind_of?(Port)
|
7
|
+
@port = port
|
8
|
+
@session_queues = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.with_each_session(port, &block)
|
12
|
+
return unless block_given?
|
13
|
+
session_manager = self.new(port)
|
14
|
+
threads = Set.new
|
15
|
+
mutex = Mutex.new
|
16
|
+
session_manager.start do |session|
|
17
|
+
mutex.synchronize do
|
18
|
+
threads << thread = Thread.start do
|
19
|
+
block.call(session)
|
20
|
+
mutex.synchronize { threads.delete thread }
|
21
|
+
end
|
22
|
+
end
|
20
23
|
end
|
24
|
+
ensure
|
25
|
+
log "Waiting for #{threads.count} threads"
|
26
|
+
mutex.synchronize { threads.dup }.each(&:join)
|
27
|
+
session_manager.close
|
28
|
+
end
|
29
|
+
|
30
|
+
def start(&block)
|
31
|
+
log "starting read loop on #{@port.inspect}"
|
32
|
+
loop do
|
33
|
+
envelope = @port.read
|
34
|
+
fail "no 'message' tag in envelope" if (message = envelope['message']).nil?
|
35
|
+
fail "no 'session_id' tag in envelope" if (session_id = envelope['session_id']).nil? || session_id == "0"
|
36
|
+
session_id = session_id.to_i
|
37
|
+
fail "null(0) 'session_id' tag in envelope" if session_id == 0
|
38
|
+
|
39
|
+
case message
|
40
|
+
when 'create_session'
|
41
|
+
session = Session.new(self, session_id.to_i)
|
42
|
+
@session_queues[session.id] = Queue.new
|
43
|
+
block.call(session) unless block.nil?
|
44
|
+
when 'message_session'
|
45
|
+
fail "No session for #{session_id.to_i}" if (queue = @session_queues[session_id.to_i]).nil?
|
46
|
+
queue << envelope['payload']
|
47
|
+
else
|
48
|
+
fail "did not recognize message: '#{message}'" if (session_id = envelope['session_id']).nil? || session_id == 0
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
rescue EOFError => e
|
53
|
+
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
54
|
+
rescue IOError => e
|
55
|
+
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
56
|
+
# raise
|
57
|
+
end
|
58
|
+
|
59
|
+
def with_session
|
60
|
+
return unless block_given?
|
61
|
+
yield session = create_session
|
62
|
+
ensure
|
63
|
+
session.close unless session.nil?
|
21
64
|
end
|
22
|
-
end
|
23
|
-
ensure
|
24
|
-
log "Waiting for #{threads.count} threads"
|
25
|
-
mutex.synchronize { threads.dup }.each(&:join)
|
26
|
-
session_manager.close
|
27
|
-
end
|
28
|
-
|
29
|
-
def start(&block)
|
30
|
-
log "starting read loop on #{@port.inspect}"
|
31
|
-
loop do
|
32
|
-
envelope = @port.read
|
33
|
-
fail "no 'message' tag in envelope" if (message = envelope['message']).nil?
|
34
|
-
fail "no 'session_id' tag in envelope" if (session_id = envelope['session_id']).nil? || session_id == "0"
|
35
|
-
session_id = session_id.to_i
|
36
|
-
fail "null(0) 'session_id' tag in envelope" if session_id == 0
|
37
65
|
|
38
|
-
|
39
|
-
|
40
|
-
|
66
|
+
def create_session
|
67
|
+
session = Session.send(:new, self)
|
68
|
+
@port.write(message: 'create_session', session_id: session.id)
|
41
69
|
@session_queues[session.id] = Queue.new
|
42
|
-
|
43
|
-
when 'message_session'
|
44
|
-
fail "No session for #{session_id.to_i}" if (queue = @session_queues[session_id.to_i]).nil?
|
45
|
-
queue << envelope['payload']
|
46
|
-
else
|
47
|
-
fail "did not recognize message: '#{message}'" if (session_id = envelope['session_id']).nil? || session_id == 0
|
70
|
+
session
|
48
71
|
end
|
49
|
-
|
50
|
-
end
|
51
|
-
rescue EOFError => e
|
52
|
-
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
53
|
-
rescue IOError => e
|
54
|
-
# log "#{e.message}\n#{e.backtrace.join("\n")}"
|
55
|
-
# raise
|
56
|
-
end
|
57
|
-
|
58
|
-
def with_session
|
59
|
-
return unless block_given?
|
60
|
-
yield session = create_session
|
61
|
-
ensure
|
62
|
-
session.close unless session.nil?
|
63
|
-
end
|
64
|
-
|
65
|
-
def create_session
|
66
|
-
session = Session.send(:new, self)
|
67
|
-
@port.write(message: 'create_session', session_id: session.id)
|
68
|
-
@session_queues[session.id] = Queue.new
|
69
|
-
session
|
70
|
-
end
|
71
|
-
|
72
|
-
def close
|
73
|
-
log "session manager: closing #{@port.inspect}"
|
74
|
-
end
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
73
|
+
def close
|
74
|
+
log "session manager: closing #{@port.inspect}"
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def close_session(session)
|
80
|
+
log "closing session: #{session.id} on #{@port.inspect}"
|
81
|
+
@session_queues.delete(session.id)
|
82
|
+
end
|
83
|
+
|
84
|
+
def read_session(session)
|
85
|
+
fail "No queue for #{session.inspect}" if (queue = @session_queues[session.id]).nil?
|
86
|
+
fail EOFError if queue.empty? && @port.closed?
|
87
|
+
queue.pop
|
88
|
+
end
|
89
|
+
|
90
|
+
def write_session(session, object)
|
91
|
+
@port.write(message: 'message_session', session_id: session.id, payload: object)
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
def self.log(message)
|
96
|
+
$stderr.print "#{message}\n" if false
|
97
|
+
end
|
98
|
+
def log(message)
|
99
|
+
self.class.log(message)
|
100
|
+
end
|
101
|
+
end
|
99
102
|
end
|
100
103
|
end
|
101
|
-
end ; end ; end
|
@@ -15,7 +15,7 @@ Rake::Task.define_task(:'subproject:server:start', [:fd]) do |t, args|
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def log(message)
|
18
|
+
def log(message) #:nodoc: all
|
19
19
|
$stderr.print "#{message}\n" if false
|
20
20
|
end
|
21
21
|
|
@@ -43,7 +43,7 @@ Rake::Task.define_task(:'subproject:server:start', [:fd]) do |t, args|
|
|
43
43
|
Rake::Task[task_name].invoke(*task_args['array'])
|
44
44
|
log "#{task_name} complete!"
|
45
45
|
session.write(message: 'task_complete')
|
46
|
-
rescue
|
46
|
+
rescue StandardError => e
|
47
47
|
session.write(message: 'task_failed', exception:{message: e.message, backtrace: e.backtrace})
|
48
48
|
ensure
|
49
49
|
session.close
|
data/rake-subproject.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
|
-
require "
|
5
|
+
require "rake/subproject/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = "rake-subproject"
|
@@ -7,11 +7,10 @@ describe Rake::Subproject do
|
|
7
7
|
Rake::Subproject::VERSION.should_not be_nil
|
8
8
|
end
|
9
9
|
|
10
|
-
it 'should do something useful' do
|
11
|
-
false.should eq(true)
|
12
|
-
end
|
13
|
-
|
14
10
|
it "accepts the #subproject call" do
|
15
|
-
|
11
|
+
Dir.chdir("#{SUPPORT_DIR}/exceptions") do
|
12
|
+
load "Rakefile"
|
13
|
+
expect { Rake.application.lookup(:exception).invoke }.to raise_error(Rake::Subproject::Error)
|
14
|
+
end
|
16
15
|
end
|
17
16
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-subproject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Bishop
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description:
|
@@ -59,7 +59,7 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- .gitignore
|
62
|
+
- ".gitignore"
|
63
63
|
- Gemfile
|
64
64
|
- LICENSE.txt
|
65
65
|
- README.md
|
@@ -81,6 +81,9 @@ files:
|
|
81
81
|
- rake-subproject.gemspec
|
82
82
|
- spec/rake/subproject_spec.rb
|
83
83
|
- spec/spec_helper.rb
|
84
|
+
- spec/support/exceptions/Rakefile
|
85
|
+
- spec/support/exceptions/foo/Rakefile
|
86
|
+
- spec/support/exceptions/foo/bar/Rakefile
|
84
87
|
homepage: ''
|
85
88
|
licenses:
|
86
89
|
- MIT
|
@@ -91,12 +94,12 @@ require_paths:
|
|
91
94
|
- lib
|
92
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
93
96
|
requirements:
|
94
|
-
- - ~>
|
97
|
+
- - "~>"
|
95
98
|
- !ruby/object:Gem::Version
|
96
99
|
version: '2.0'
|
97
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
101
|
requirements:
|
99
|
-
- -
|
102
|
+
- - ">="
|
100
103
|
- !ruby/object:Gem::Version
|
101
104
|
version: '0'
|
102
105
|
requirements: []
|
@@ -108,3 +111,6 @@ summary: Allows bridging of sub-projects into super-projects
|
|
108
111
|
test_files:
|
109
112
|
- spec/rake/subproject_spec.rb
|
110
113
|
- spec/spec_helper.rb
|
114
|
+
- spec/support/exceptions/Rakefile
|
115
|
+
- spec/support/exceptions/foo/Rakefile
|
116
|
+
- spec/support/exceptions/foo/bar/Rakefile
|