justrun 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/justrun.rb +60 -11
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec7679a78b2e88636c92105d18866774991c8ce8
|
4
|
+
data.tar.gz: 948d3b2b1d3f45e2b43146a15b72791fe37a7917
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e48401fce9c94d5377633ad2159ee6029bd2cafefc96d3453d31f5b898cead16ca2c8354fa805699f3dee97dba7881fab78d2434e518a12272665544b28fb097
|
7
|
+
data.tar.gz: c175d9e49ec3ac95fbf0a6da508f25920de60480d35dc8a3f806d05d26a6d9bf5cb555e53495f1bf8084860241955711208297ba6abd9f4f2d42d7ee8217bc53
|
data/lib/justrun.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'open3'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
#TODO: Run multiple commands at the same time
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
}, &block)
|
5
|
+
class JustRun
|
6
|
+
def self.command(command, block_size: 4096*4, init: ->(writer) {}, &block)
|
9
7
|
ret_code = -1
|
10
8
|
Open3.popen3 command do |stdin, stdout, stderr, wait_thr|
|
11
|
-
|
9
|
+
writer = JustRun::Writer.new stdin
|
10
|
+
init.call writer
|
11
|
+
|
12
12
|
fileno_lines = {}
|
13
13
|
begin
|
14
14
|
files = [stdout, stderr]
|
@@ -17,7 +17,7 @@ class JustRun
|
|
17
17
|
stderr.fileno => :stderr
|
18
18
|
}
|
19
19
|
until all_eof files do
|
20
|
-
ready = IO.select files
|
20
|
+
ready = IO.select files, stdin.closed? ? [] : [stdin], [], 0.1
|
21
21
|
if ready
|
22
22
|
readable = ready[0]
|
23
23
|
readable.each do |f|
|
@@ -26,25 +26,29 @@ class JustRun
|
|
26
26
|
lines = fileno_lines[fileno]
|
27
27
|
name = fileno2name[fileno]
|
28
28
|
begin
|
29
|
-
data = f.read_nonblock
|
29
|
+
data = f.read_nonblock block_size
|
30
30
|
lines_new = data.lines
|
31
31
|
if lines.length > 0 and lines[-1] !~ /\n\r?$/
|
32
32
|
lines[-1] = lines[-1] + lines_new.shift
|
33
33
|
end
|
34
34
|
lines.push(*lines_new)
|
35
35
|
while lines[0] =~ /\n\r?/
|
36
|
-
block.call lines.shift.chomp, name,
|
36
|
+
block.call lines.shift.chomp, name, writer
|
37
37
|
end
|
38
38
|
rescue EOFError => e
|
39
39
|
# expected
|
40
40
|
end
|
41
|
+
writable = ready[1]
|
42
|
+
writable.each do |stdin|
|
43
|
+
writer.process
|
44
|
+
end
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
44
48
|
fileno_lines.each do |fileno, lines|
|
45
49
|
name = fileno2name[fileno]
|
46
50
|
if lines.length > 0
|
47
|
-
block.call lines.shift.chomp, name,
|
51
|
+
block.call lines.shift.chomp, name, writer
|
48
52
|
end
|
49
53
|
end
|
50
54
|
rescue IOError => e
|
@@ -59,6 +63,51 @@ class JustRun
|
|
59
63
|
def self.all_eof(files)
|
60
64
|
files.find { |f| !f.eof }.nil?
|
61
65
|
end
|
62
|
-
BLOCK_SIZE = 4096*4
|
63
66
|
|
67
|
+
class Writer
|
68
|
+
def initialize stdin
|
69
|
+
@buffer = ''
|
70
|
+
@stdin = stdin
|
71
|
+
end
|
72
|
+
|
73
|
+
def puts str
|
74
|
+
write "#{str}\n"
|
75
|
+
end
|
76
|
+
|
77
|
+
def write str
|
78
|
+
@buffer << str;
|
79
|
+
process
|
80
|
+
end
|
81
|
+
|
82
|
+
def on_empty callback
|
83
|
+
@on_empty = callback
|
84
|
+
end
|
85
|
+
|
86
|
+
def end str = ''
|
87
|
+
if str.length > 0
|
88
|
+
write str
|
89
|
+
end
|
90
|
+
if @buffer.length > 0
|
91
|
+
on_empty -> {
|
92
|
+
self.end
|
93
|
+
}
|
94
|
+
else
|
95
|
+
@stdin.close_write
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def process
|
100
|
+
return unless @buffer.length > 0
|
101
|
+
loop do
|
102
|
+
written = @stdin.write_nonblock @buffer
|
103
|
+
@buffer = @buffer[written..-1]
|
104
|
+
if @buffer.length == 0 and @on_empty
|
105
|
+
@on_empty.call
|
106
|
+
return
|
107
|
+
end
|
108
|
+
break if written == 0
|
109
|
+
end
|
110
|
+
rescue IO::WaitWritable, Errno::EINTR
|
111
|
+
end
|
112
|
+
end
|
64
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: justrun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damian Kaczmarek
|
@@ -53,7 +53,9 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.6.2
|
55
55
|
description: Wraps popen3 in a nice interface that allows to just run a command and
|
56
|
-
get line by line
|
56
|
+
get live stdout and stderr on line by line basis using a callback. Additionally
|
57
|
+
a live chat with a command can be implemented with a buffered non-blocking writer
|
58
|
+
that's working out of the box.
|
57
59
|
email: rush@virtkick.com
|
58
60
|
executables: []
|
59
61
|
extensions: []
|
@@ -83,5 +85,5 @@ rubyforge_project:
|
|
83
85
|
rubygems_version: 2.4.6
|
84
86
|
signing_key:
|
85
87
|
specification_version: 4
|
86
|
-
summary: Run command and get live line by line
|
88
|
+
summary: Run command and get live line by line callbacks
|
87
89
|
test_files: []
|