logger_pipe 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: af7068613fe359a54637b22307dbea224fb24c54
4
- data.tar.gz: 89728bb6cc659b443ffd23741f665f2212fc40e8
3
+ metadata.gz: fd276efaaeaec72d772ef2850226516e2fdbd75d
4
+ data.tar.gz: 3a8b2f21d9a5e920db4dd4ead277e89a78a0941d
5
5
  SHA512:
6
- metadata.gz: e054919d64f00990972b84fcdbd2124307a9b94ccff3633584ed4709af9119782751c92a4b2cfd6c220b937e3197230962c58f7a6f9f4d990a2888282138be39
7
- data.tar.gz: 5f535fa69f4fcb9e6444d03545483afa358aade7e1e2527b6d8b37140e467a5184cd906f7c96aa62e7204a202b1a494c35a5557e7760f21206121502903bc23a
6
+ metadata.gz: bf66b0f214bb5dbb5370cfec1e4339bffd2d9af0af26354e583e3f35b0732d60496b38eabb753a4b168112f87c1dfe8629fcf57a26898bd885c3d7e2396f3201
7
+ data.tar.gz: d28ec1066da06d0759b41b727e2ff31f684b815f27e74193143d248908ff0c8ceafaca9854af359d3d835f284eaafe1624d4c38bb34ae565a9dc6d3bb32f4106
data/Gemfile CHANGED
@@ -2,3 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in logger_pipe.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "pry"
8
+ gem "pry-byebug"
9
+ gem "pry-stack_explorer"
10
+ gem "simplecov"
11
+ gem "fuubar"
12
+ end
@@ -2,6 +2,7 @@
2
2
  require "logger_pipe"
3
3
 
4
4
  require "timeout"
5
+ require 'tempfile'
5
6
 
6
7
  module LoggerPipe
7
8
 
@@ -28,48 +29,57 @@ module LoggerPipe
28
29
  return nil
29
30
  end
30
31
  logger.info("executing: #{cmd}")
31
- buf = []
32
+ @buf = []
32
33
  # systemをタイムアウトさせることはできないので、popenの戻り値を使っています。
33
34
  # see http://docs.ruby-lang.org/ja/2.0.0/class/Timeout.html
34
- com, pid = nil, nil
35
- begin
36
- Timeout.timeout( @timeout ) do
35
+ @com, @pid = nil, nil
36
+ stderr_buffer do |stderr_fp|
37
+ timeout do
37
38
 
38
39
  # popenにブロックを渡さないと$?がnilになってしまうので敢えてブロックで処理しています。
39
- com = IO.popen(cmd) do |com|
40
- pid = com.pid
40
+ @com = IO.popen("#{cmd} 2> #{stderr_fp.path}") do |com|
41
+ @com = com
42
+ @pid = com.pid
41
43
  while line = com.gets
42
- buf << line
44
+ @buf << line
43
45
  logger.debug(line.chomp)
44
46
  end
45
47
  end
46
48
  if $?.exitstatus == 0
49
+ logging_stderr(stderr_fp)
47
50
  logger.info("\e[32mSUCCESS: %s\e[0m" % [cmd])
48
- return buf.join
51
+ return @buf.join
49
52
  else
53
+ logging_stderr(stderr_fp)
50
54
  msg = "\e[31mFAILURE: %s\e[0m" % [cmd]
51
55
  logger.error(msg)
52
- raise Failure.new(msg, buf)
56
+ raise Failure.new(msg, @buf)
53
57
  end
54
58
 
55
59
  end
60
+ end
61
+ end
62
+
63
+ def timeout(&block)
64
+ begin
65
+ Timeout.timeout(@timeout, &block)
56
66
  rescue Timeout::Error => e
57
- logger.error("[#{e.class.name} #{e.message}] now killing process #{pid}: #{cmd}")
67
+ logger.error("[#{e.class.name} #{e.message}] now killing process pid:#{@pid.inspect}: #{cmd}")
58
68
  begin
59
- Process.kill('SIGINT', pid) if pid
69
+ Process.kill('SIGINT', @pid) if @pid
60
70
  rescue Exception => err
61
71
  logger.error("[#{err.class.name}] #{err.message}")
62
72
  end
63
73
  begin
64
74
  Timeout.timeout(10) do
65
- result = com.read
75
+ result = @com.read
66
76
  end
67
77
  rescue Exception => err
68
78
  logger.error("failure to get result [#{err.class.name}] #{err.message}")
69
79
  result = "<failure to get result>"
70
80
  end
71
81
  begin
72
- msg = "\e[31mEXECUTION Timeout: %s\e[0m\n%s\n[result]: %s" % [cmd, buf.join.strip, result]
82
+ msg = "\e[31mEXECUTION Timeout: %s\e[0m\n%s\n[result]: %s" % [cmd, @buf.join.strip, result]
73
83
  logger.error(msg)
74
84
  rescue Exception => err
75
85
  logger.error("[#{err.class.name}] #{err.message}")
@@ -78,6 +88,20 @@ module LoggerPipe
78
88
  end
79
89
  end
80
90
 
91
+ def stderr_buffer
92
+ Tempfile.open("logger_pipe.stderr.log") do |f|
93
+ f.close
94
+ return block_given? ? yield(f) : nil
95
+ end
96
+ end
97
+
98
+ def logging_stderr(f)
99
+ f.open
100
+ c = f.read
101
+ if !c.nil? && !c.empty?
102
+ logger.info("--- begin stderr ---\n#{c}\n--- end stderr ---")
103
+ end
104
+ end
81
105
  end
82
106
 
83
107
  end
@@ -1,3 +1,3 @@
1
1
  module LoggerPipe
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  require 'stringio'
@@ -37,6 +38,24 @@ describe LoggerPipe do
37
38
  end
38
39
  end
39
40
 
41
+ context "stderr" do
42
+ let(:cmd){ File.expand_path("../stderr_test.sh", __FILE__) }
43
+ it "returns STDOUT on success" do
44
+ res = LoggerPipe.run(logger, "#{cmd} 0")
45
+ # puts buffer.string
46
+ expect(buffer.string).to match /bar\n/
47
+ expect(res).to eq "foo\nbaz\n"
48
+ end
49
+
50
+ it "buffer include stderr content on error" do
51
+ expect{
52
+ LoggerPipe.run(logger, "#{cmd} 1")
53
+ }.to raise_error(LoggerPipe::Failure)
54
+ # puts buffer.string
55
+ expect(buffer.string).to match /bar\n/
56
+ end
57
+ end
58
+
40
59
  context "dry_run: true" do
41
60
  let(:cmd){ "date +'Foo: %Y-%m-%dT%H:%M:%S'; sleep 1; date +'Bar: %Y-%m-%dT%H:%M:%S'" }
42
61
  it "returns nil" do
@@ -0,0 +1,7 @@
1
+ #! /bin/sh
2
+
3
+ echo "foo" >&1
4
+ echo "bar" >&2
5
+ echo "baz" >&1
6
+
7
+ exit $1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logger_pipe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - akima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-20 00:00:00.000000000 Z
11
+ date: 2015-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,7 @@ files:
72
72
  - logger_pipe.gemspec
73
73
  - spec/logger_pipe_spec.rb
74
74
  - spec/spec_helper.rb
75
+ - spec/stderr_test.sh
75
76
  homepage: https://github.com/groovenauts/logger_pipe
76
77
  licenses:
77
78
  - MIT
@@ -99,3 +100,4 @@ summary: logger_pipe helps to connect child process STDOUT to Logger on realtime
99
100
  test_files:
100
101
  - spec/logger_pipe_spec.rb
101
102
  - spec/spec_helper.rb
103
+ - spec/stderr_test.sh