em-systemcommand 0.0.1 → 0.0.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/em-systemcommand.gemspec +3 -3
- data/lib/em-systemcommand/pipe.rb +26 -22
- data/lib/em-systemcommand/version.rb +1 -1
- data/spec/em-systemcommand/pipe_spec.rb +146 -0
- metadata +17 -14
data/em-systemcommand.gemspec
CHANGED
@@ -4,9 +4,9 @@ require File.expand_path('../lib/em-systemcommand/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Arthur Andersen"]
|
6
6
|
gem.email = ["leoc.git@gmail.com"]
|
7
|
-
gem.description = %q{}
|
8
|
-
gem.summary = %q{}
|
9
|
-
gem.homepage = ""
|
7
|
+
gem.description = %q{`em-systemcommand` is a simple abstraction for invoking system commands and handling their output easily with eventmachine.}
|
8
|
+
gem.summary = %q{Sweeter popen3 for EventMachine.}
|
9
|
+
gem.homepage = "http://leoc.github.com/em-systemcommand/"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -30,7 +30,7 @@ module EventMachine
|
|
30
30
|
# Invoked when line was received
|
31
31
|
def receive_line line
|
32
32
|
receive_line_callbacks.each do |callback|
|
33
|
-
callback.call line
|
33
|
+
callback.call line.dup
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -41,9 +41,9 @@ module EventMachine
|
|
41
41
|
|
42
42
|
# Invoked when a line was written, but `\r` was received without
|
43
43
|
# a line-break in the end.
|
44
|
-
def receive_update
|
44
|
+
def receive_update buffer
|
45
45
|
receive_update_callbacks.each do |callback|
|
46
|
-
callback.call
|
46
|
+
callback.call buffer.dup
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -53,34 +53,38 @@ module EventMachine
|
|
53
53
|
end
|
54
54
|
|
55
55
|
# Invoked when data was received.
|
56
|
-
def receive_data data
|
57
|
-
|
58
|
-
|
56
|
+
def receive_data data, recursive = false
|
57
|
+
unless recursive
|
58
|
+
receive_data_callbacks.each do |callback|
|
59
|
+
callback.call data.dup
|
60
|
+
end
|
59
61
|
end
|
60
|
-
|
61
62
|
@lt2_linebuffer ||= []
|
62
63
|
|
63
64
|
ix = data.index("\r")
|
64
|
-
if ix
|
65
|
-
@lt2_linebuffer << data[0...ix]
|
66
|
-
ln = @lt2_linebuffer.join
|
65
|
+
if ix && data[ix+1] != "\n"
|
66
|
+
ln = (@lt2_linebuffer << data[0...ix]).join
|
67
67
|
@lt2_linebuffer.clear
|
68
|
+
receive_line ln
|
68
69
|
@outputbuffer.print ln
|
69
70
|
@outputbuffer.pos -= ln.length
|
70
|
-
receive_line ln
|
71
|
-
receive_update @outputbuffer.string
|
72
|
-
receive_data data[(ix+1)..-1] # receive rest data
|
73
|
-
elsif ix = data.index("\n")
|
74
|
-
@lt2_linebuffer << data[0...ix]
|
75
|
-
ln = @lt2_linebuffer.join
|
76
|
-
@lt2_linebuffer.clear
|
77
|
-
ln.chomp!
|
78
|
-
@outputbuffer.puts ln
|
79
|
-
receive_line ln
|
80
71
|
receive_update @outputbuffer.string
|
81
|
-
receive_data data[(ix+1)..-1] # receive rest data
|
72
|
+
receive_data data[(ix+1)..-1], true # receive rest data
|
82
73
|
else
|
83
|
-
|
74
|
+
if ix = data.index("\n")
|
75
|
+
ln = (@lt2_linebuffer << data[0...ix]).join
|
76
|
+
@lt2_linebuffer.clear
|
77
|
+
ln.chomp!
|
78
|
+
receive_line ln
|
79
|
+
receive_data data[(ix+1)..-1], true # receive rest data
|
80
|
+
else
|
81
|
+
@lt2_linebuffer << data
|
82
|
+
end
|
83
|
+
|
84
|
+
unless recursive
|
85
|
+
@outputbuffer.puts data
|
86
|
+
receive_update @outputbuffer.string
|
87
|
+
end
|
84
88
|
end
|
85
89
|
end
|
86
90
|
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Pipe' do
|
4
|
+
|
5
|
+
context '#data callback' do
|
6
|
+
|
7
|
+
it 'should be called on data' do
|
8
|
+
received = []
|
9
|
+
EM.run do
|
10
|
+
EM::SystemCommand.new %q{echo -n "123123";} do |on|
|
11
|
+
on.stdout.data do |data|
|
12
|
+
received << data
|
13
|
+
end
|
14
|
+
|
15
|
+
on.success do
|
16
|
+
EM.stop_event_loop
|
17
|
+
received.should == ["123123"]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should be called once even when there is a linebreak' do
|
24
|
+
received = []
|
25
|
+
EM.run do
|
26
|
+
EM::SystemCommand.new %Q{echo "123\n456"} do |on|
|
27
|
+
on.stdout.data do |data|
|
28
|
+
received << data
|
29
|
+
end
|
30
|
+
|
31
|
+
on.success do
|
32
|
+
EM.stop_event_loop
|
33
|
+
received.should == ["123\n456\n"]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context '#line callback' do
|
41
|
+
|
42
|
+
it 'should be called on readline' do
|
43
|
+
received = []
|
44
|
+
EM.run do
|
45
|
+
EM::SystemCommand.new 'echo "123"; echo "456"' do |on|
|
46
|
+
on.stdout.line do |data|
|
47
|
+
received << data
|
48
|
+
end
|
49
|
+
|
50
|
+
on.success do
|
51
|
+
EM.stop_event_loop
|
52
|
+
received.should == ["123","456"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should be called on carriage return' do
|
59
|
+
received = []
|
60
|
+
EM.run do
|
61
|
+
EM::SystemCommand.new "echo -n \"123\r\"; echo -n \"456\r\"" do |on|
|
62
|
+
on.stdout.line do |data|
|
63
|
+
received << data
|
64
|
+
end
|
65
|
+
|
66
|
+
on.success do
|
67
|
+
EM.stop_event_loop
|
68
|
+
received.should == ["123","456"]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
context '#update callback' do
|
77
|
+
|
78
|
+
it 'should be called on receive data' do
|
79
|
+
received = []
|
80
|
+
EM.run do
|
81
|
+
EM::SystemCommand.new %q{ruby -e '$stdout.sync = true; puts "123"; puts "456"; exit 0'} do |on|
|
82
|
+
on.stdout.update do |data|
|
83
|
+
received << data
|
84
|
+
end
|
85
|
+
|
86
|
+
on.success do
|
87
|
+
EM.stop_event_loop
|
88
|
+
received.should == ["123\n456\n"]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should be called on carriage return'do
|
95
|
+
received = []
|
96
|
+
EM.run do
|
97
|
+
EM::SystemCommand.new %q{ruby -e '$stdout.sync = true; print "123\r"; print "456\r"; exit 0;'} do |on|
|
98
|
+
on.stdout.update do |data|
|
99
|
+
received << data
|
100
|
+
end
|
101
|
+
|
102
|
+
on.success do
|
103
|
+
EM.stop_event_loop
|
104
|
+
received.should == ["123","456"]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
context '#match callback' do
|
113
|
+
|
114
|
+
it 'should match in lines on receive_line' do
|
115
|
+
received = []
|
116
|
+
EM.run do
|
117
|
+
EM::SystemCommand.new 'echo "-123-"; echo "-456-"' do |on|
|
118
|
+
on.stdout.match /-([0-9]+)-/, in: :line do |match, number|
|
119
|
+
received << number
|
120
|
+
end
|
121
|
+
|
122
|
+
on.success do
|
123
|
+
EM.stop_event_loop
|
124
|
+
received.should == ["123","456"]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should match in output buffer on receive_update' do
|
131
|
+
received = []
|
132
|
+
EM.run do
|
133
|
+
EM::SystemCommand.new %q{ruby -e '$stdout.sync = true; print "-123-\r"; print "-456-\r"; exit 0'} do |on|
|
134
|
+
on.stdout.match /-([0-9]+)-/, in: :output do |match, number|
|
135
|
+
received << number
|
136
|
+
end
|
137
|
+
|
138
|
+
on.success do
|
139
|
+
EM.stop_event_loop
|
140
|
+
received.should == ["123","456"]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-systemcommand
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-05-03 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &15758320 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15758320
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: guard
|
27
|
-
requirement: &
|
27
|
+
requirement: &15757900 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15757900
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: guard-rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &15757480 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15757480
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: eventmachine
|
49
|
-
requirement: &
|
49
|
+
requirement: &15757060 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,8 +54,9 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
description: '
|
57
|
+
version_requirements: *15757060
|
58
|
+
description: ! '`em-systemcommand` is a simple abstraction for invoking system commands
|
59
|
+
and handling their output easily with eventmachine.'
|
59
60
|
email:
|
60
61
|
- leoc.git@gmail.com
|
61
62
|
executables: []
|
@@ -75,9 +76,10 @@ files:
|
|
75
76
|
- lib/em-systemcommand/pipe.rb
|
76
77
|
- lib/em-systemcommand/pipe_handler.rb
|
77
78
|
- lib/em-systemcommand/version.rb
|
79
|
+
- spec/em-systemcommand/pipe_spec.rb
|
78
80
|
- spec/em-systmcommand_spec.rb
|
79
81
|
- spec/spec_helper.rb
|
80
|
-
homepage:
|
82
|
+
homepage: http://leoc.github.com/em-systemcommand/
|
81
83
|
licenses: []
|
82
84
|
post_install_message:
|
83
85
|
rdoc_options: []
|
@@ -91,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
93
|
version: '0'
|
92
94
|
segments:
|
93
95
|
- 0
|
94
|
-
hash:
|
96
|
+
hash: 1032531485384539131
|
95
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
98
|
none: false
|
97
99
|
requirements:
|
@@ -100,13 +102,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
102
|
version: '0'
|
101
103
|
segments:
|
102
104
|
- 0
|
103
|
-
hash:
|
105
|
+
hash: 1032531485384539131
|
104
106
|
requirements: []
|
105
107
|
rubyforge_project:
|
106
108
|
rubygems_version: 1.8.17
|
107
109
|
signing_key:
|
108
110
|
specification_version: 3
|
109
|
-
summary:
|
111
|
+
summary: Sweeter popen3 for EventMachine.
|
110
112
|
test_files:
|
113
|
+
- spec/em-systemcommand/pipe_spec.rb
|
111
114
|
- spec/em-systmcommand_spec.rb
|
112
115
|
- spec/spec_helper.rb
|