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.
@@ -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 line
44
+ def receive_update buffer
45
45
  receive_update_callbacks.each do |callback|
46
- callback.call line
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
- receive_data_callbacks.each do |callback|
58
- callback.call data
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 and data[ix+1] != "\n"
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
- @lt2_linebuffer << data
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
 
@@ -1,5 +1,5 @@
1
1
  module Em
2
2
  module Systemcommand
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -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.1
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: &18939980 !ruby/object:Gem::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: *18939980
24
+ version_requirements: *15758320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: guard
27
- requirement: &18939560 !ruby/object:Gem::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: *18939560
35
+ version_requirements: *15757900
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard-rspec
38
- requirement: &18939000 !ruby/object:Gem::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: *18939000
46
+ version_requirements: *15757480
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: eventmachine
49
- requirement: &18938420 !ruby/object:Gem::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: *18938420
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: -1466650369422800238
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: -1466650369422800238
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