logger_pipe 0.2.1 → 0.3.0

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 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