timestamped_out 0.1.0 → 0.2.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: c64ce4f00d4d9ae6802e3ee51e08a76129aa4a13
4
- data.tar.gz: 777ad3ffc008b8e89e3d1abda40aaeefe4b6d639
3
+ metadata.gz: 140f805dbd7c2fcbd5f47704d7f1e72bb5bc7246
4
+ data.tar.gz: 6ec21b1653a47f803baaafe77630f41fc81163e0
5
5
  SHA512:
6
- metadata.gz: af5beba41eac6d4bf8f54325d52b330b7f03473e18f23ca2050bd0b6afa2ec6b03e264f4190cb4fe8bd76c7abc51095069ac55c6e0e4a1bc5ea3310c3bdaf1f0
7
- data.tar.gz: 69bdf9fd1e41dc783ccbb0e2d8a6a1b7f178c673f41af7202d03c9d2153d0cc59699b3e0a8794cbcbc3848312412a09a0a40291fb3bfdab8ebc1780335b131e0
6
+ metadata.gz: ba223cbd2f97776a5052160fd0f9368867043c72505b7740fd31ebff447be8c74649f90be294ca346b497468668e4d3679b1ffa3afc1ecb36447e64484ba4982
7
+ data.tar.gz: 7e9fb68aaecb243fb6e47fb21edf95118e384ef12285270957c6cbd58d13667b0e490abb4f956ffdc2b899814792b800a8d3d59a0b8501e75ad661e52566c493
data/README.md CHANGED
@@ -20,18 +20,35 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
+ Prints STDOUT as INFO:
24
+
23
25
  ```ruby
24
26
  TimestampedOut.new.call do
25
27
  print "\nTest"
26
28
  end
27
- 2016-05-29 14:34:18 UTC 24342 TID-ovyq9cdtw INFO: Test => #<TimestampedOut:0x007fb6ca83e4a0>
29
+ 2016-06-23 17:08:10 +0200 95434 TID-out0sge0o INFO: Test
28
30
  ```
29
31
 
32
+ Prints STDERR (including backtrace) as ERROR:
33
+
30
34
  ```ruby
31
35
  TimestampedOut.new.call do
32
36
  1 / 0
33
37
  end
34
- 2016-05-29 14:34:56 UTC 24342 TID-ovyq9cdtw ERROR: divided by 0
38
+ 2016-06-23 17:20:42 +0200 95986 TID-ow6a19fy4 ERROR: divided by 0
39
+ ...backtrace...
40
+ ```
41
+
42
+ Works also with embedded shell commands:
43
+
44
+ ```ruby
45
+ TimestampedOut.new.call do
46
+ system 'echo "abc"'
47
+ result = `echo "2"`
48
+ p result.to_i * 3
49
+ end
50
+ 2016-06-23 17:23:07 +0200 95986 TID-ow6a2el10 INFO: abc
51
+ 2016-06-23 17:23:07 +0200 95986 TID-ow6a2el10 INFO: 6
35
52
  ```
36
53
 
37
54
  ## Development
@@ -44,8 +61,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
44
61
 
45
62
  Bug reports and pull requests are welcome on GitHub at https://github.com/maicher/timestamped_out. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
46
63
 
47
-
48
64
  ## License
49
65
 
50
66
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
51
-
@@ -1,3 +1,3 @@
1
1
  class TimestampedOut
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -1,45 +1,49 @@
1
1
  require 'timestamped_out/version'
2
2
 
3
3
  class TimestampedOut
4
- class TimestampedStringIO < StringIO
5
- def initialize(stdout, level)
6
- @stdout = stdout
7
- @level = level
8
- end
9
-
10
- def write(str)
11
- timestamped_str =
12
- if str.length == 1 && str == "\n"
13
- ''
14
- elsif str[0] == "\n"
15
- prepend_timestamp(str[1..-1])
16
- elsif str[-1] == "\n"
17
- prepend_timestamp(str[0..-2])
18
- else
19
- prepend_timestamp(str)
20
- end
4
+ DEFAULT_FORMATTER = lambda { |severity, datetime, progname, message| "#{datetime} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{progname} #{severity}: #{message}\n" }
21
5
 
22
- @stdout.write(timestamped_str)
23
- end
24
-
25
- private
6
+ attr_accessor :formatter
26
7
 
27
- def prepend_timestamp(str)
28
- "\n#{Time.now} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)} #{@level}: #{str}"
29
- end
8
+ def initialize(formatter = DEFAULT_FORMATTER)
9
+ self.formatter = formatter
30
10
  end
31
11
 
32
12
  def call
33
- buffered_stdout = $stdout
34
- buffered_stderr = $stderr
35
- $stdout = TimestampedStringIO.new(buffered_stdout, 'INFO')
36
- $stderr = TimestampedStringIO.new(buffered_stderr, 'ERROR')
13
+ old_stdout = STDOUT.clone
14
+ pipe_r, pipe_w = IO.pipe
15
+ pipe_r.sync = true
16
+ output = ''
17
+ reader = Thread.new do
18
+ begin
19
+ loop do
20
+ output << formatter.call('INFO', Time.now, '', pipe_r.readpartial(1024))
21
+ end
22
+ rescue EOFError
23
+ end
24
+ end
25
+ STDOUT.reopen(pipe_w)
37
26
  yield
38
27
  self
39
- rescue Exception => e
40
- $stderr.write "\n#{e}\n#{e.backtrace.join("\n")}"
28
+ rescue StandardError => e
29
+ STDERR.write formatter.call('ERROR', Time.now, '', "#{e}\n#{e.backtrace.join("\n")}")
41
30
  ensure
42
- $stdout = buffered_stdout
43
- $stderr = buffered_stderr
31
+ STDOUT.reopen(old_stdout)
32
+ pipe_w.close
33
+ reader.join
34
+ STDOUT.write(output)
35
+ return self
36
+ end
37
+
38
+ def with_timestamp(str, level)
39
+ if str.length == 1 && str == "\n"
40
+ ''
41
+ elsif str[0] == "\n"
42
+ prepend_timestamp(str[1..-1], level)
43
+ elsif str[-1] == "\n"
44
+ prepend_timestamp(str[0..-2], level)
45
+ else
46
+ prepend_timestamp(str, level)
47
+ end
44
48
  end
45
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timestamped_out
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kjm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-29 00:00:00.000000000 Z
11
+ date: 2016-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler