capture_io 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest ADDED
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
data/.gemtest ADDED
File without changes
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2011-10-02
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/Manifest.txt ADDED
@@ -0,0 +1,8 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ bin/capture_io
7
+ lib/capture_io.rb
8
+ test/test_capture_io.rb
data/README.txt ADDED
@@ -0,0 +1,54 @@
1
+ = capture_io
2
+
3
+ * http://cyberconnect.biz/opensource
4
+
5
+ == DESCRIPTION:
6
+
7
+ Capture STDOUT given a start/stop interface
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Often times one needs the ability to capture standard output around
12
+ a section of code. And there are times required when this needs
13
+ to be done transparently without storing the output in variables
14
+ in the code requiring logging.
15
+
16
+ == SYNOPSIS:
17
+
18
+ capture_io = CaptureIO.new
19
+ capture_io.start
20
+ puts "some stdout should be captured here"
21
+ out = capture_io.stop
22
+
23
+ == REQUIREMENTS:
24
+
25
+ * platform_helpers
26
+
27
+ == INSTALL:
28
+
29
+ * gem install capture_io
30
+
31
+ == LICENSE:
32
+
33
+ (The MIT License)
34
+
35
+ Copyright (c) 2011
36
+
37
+ Permission is hereby granted, free of charge, to any person obtaining
38
+ a copy of this software and associated documentation files (the
39
+ 'Software'), to deal in the Software without restriction, including
40
+ without limitation the rights to use, copy, modify, merge, publish,
41
+ distribute, sublicense, and/or sell copies of the Software, and to
42
+ permit persons to whom the Software is furnished to do so, subject to
43
+ the following conditions:
44
+
45
+ The above copyright notice and this permission notice shall be
46
+ included in all copies or substantial portions of the Software.
47
+
48
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
49
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
50
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
51
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
52
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
53
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
54
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.spec 'capture_io' do
7
+ developer('Cliff Cyphers', 'cliff.cyphers@gmail.com')
8
+ extra_deps << 'platform_helpers'
9
+ extra_deps << 'minitest'
10
+ end
11
+
12
+ # vim: syntax=ruby
data/bin/capture_io ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ abort "you need to write me"
data/lib/capture_io.rb ADDED
@@ -0,0 +1,75 @@
1
+ # TODO add support for stderr
2
+ require 'fileutils'
3
+ require 'platform_helpers'
4
+ class CaptureIO
5
+ VERSION = '0.1.0'
6
+
7
+ attr_reader :stdout_file, :stderr_file
8
+ def initialize
9
+ unless File.directory?('io_redirect')
10
+ FileUtils.mkdir 'io_redirect'
11
+ end
12
+
13
+ base = "#{__FILE__}".gsub("#{File.dirname(__FILE__)}/", "")
14
+
15
+ @stdout_file = "io_redirect/#{Time.to_md5}_#{base}_stdout"
16
+ @stderr_file = "io_redirect/#{Time.to_md5}_#{base}_stderr"
17
+ @stdout_fd = File.open(@stdout_file, 'w+')
18
+ @stderr_fd = File.open(@stderr_file, 'w+')
19
+ end
20
+
21
+ def start
22
+ begin
23
+ @orig_stdout = $stdout
24
+ @orig_stderr = $stderr
25
+
26
+ @new_stdout = IO.new(@stdout_fd.fileno, 'w+')
27
+ @new_stderr = IO.new(@stderr_fd.fileno, 'w+')
28
+
29
+ $stdout = @new_stdout
30
+ $stderr = @new_stderr
31
+ rescue => e
32
+ p e
33
+ end
34
+ end
35
+ def stop(delete_tmp=true)
36
+ begin
37
+ @new_stdout.flush
38
+ @new_stderr.flush
39
+
40
+ $stdout = @orig_stdout
41
+ $stderr = @orig_stderr
42
+
43
+ stdout_content = File.readlines(@stdout_file)
44
+ stderr_content = File.readlines(@stderr_file)
45
+
46
+ rescue => e
47
+ p e
48
+ ensure
49
+ @new_stdout.close
50
+ @new_stderr.close
51
+ FileUtils.rm_rf 'io_redirect' if delete_tmp
52
+ end
53
+
54
+ {:stdout => stdout_content, :stderr => stderr_content }
55
+ end
56
+ end
57
+
58
+ module WrapIO
59
+ def self.auto(to=30, &blk)
60
+ raise ArgumentError, "No Block Given" unless block_given?
61
+ c = CaptureIO.new
62
+ c.start
63
+
64
+ results = blk.call
65
+
66
+ timeout(to) {
67
+ while results.kind_of?(Proc)
68
+ results = results.call
69
+ end
70
+ }
71
+
72
+ out = c.stop
73
+ out
74
+ end
75
+ end
@@ -0,0 +1,119 @@
1
+ base = File.expand_path(File.dirname(__FILE__))
2
+ require 'platform_helpers'
3
+ require 'fileutils'
4
+ require "#{base}/../lib/capture_io"
5
+ require 'timeout'
6
+ require 'minitest/unit'
7
+
8
+ # NOTE: There are times when something might fail and if the
9
+ # 'io_redirect' directory has been removed by CaptureIO.stop it
10
+ # will be impossible to know what went wrong as the error may be in
11
+ # the re-directed out. For debug purposes set 'delete_tmp=false'
12
+
13
+ MiniTest::Unit.autorun
14
+
15
+ class TestCaptureIO < MiniTest::Unit::TestCase
16
+
17
+ def setup
18
+ @capture_io = CaptureIO.new
19
+ @capture_io.start
20
+ end
21
+
22
+ def teardown
23
+ end
24
+
25
+ def test_puts
26
+
27
+ expected = 'testing puts'
28
+ puts "<TEST_PUTS>#{expected}</TEST_PUTS>"
29
+
30
+ # stop capture so we see results
31
+ stdout = @capture_io.stop(delete_tmp=true)[:stdout]
32
+ assert_equal expected, stdout.to_s.scan(/<TEST_PUTS>(.*)<\/TEST_PUTS>/m).pp
33
+ end
34
+
35
+ def test_p
36
+ expected = 'testing p'
37
+ p "<TEST_P>#{expected}</TEST_P>"
38
+
39
+ # stop capture so we see results
40
+ stdout = @capture_io.stop(delete_tmp=true)[:stdout]
41
+ assert_equal expected, stdout.to_s.scan(/<TEST_P>(.*)<\/TEST_P>/m).pp
42
+
43
+ end
44
+
45
+ def test_print
46
+ expected = 'testing print'
47
+ puts "<TEST_PRINT>#{expected}</TEST_PRINT>"
48
+
49
+ # stop capture so we see results
50
+ stdout = @capture_io.stop(delete_tmp=true)[:stdout]
51
+ assert_equal expected, stdout.to_s.scan(/<TEST_PRINT>(.*)<\/TEST_PRINT>/m).pp
52
+
53
+ end
54
+
55
+ def test_auto_block
56
+ # stop instance created during setup
57
+ @capture_io.stop
58
+
59
+ # test auto
60
+ out = WrapIO.auto { puts 'in blk with puts' ; p 'in blk with p'}
61
+ puts out.inspect
62
+
63
+ assert out[:stdout].grep(/in blk with puts/m).nitems == 1 , "Could not find IO.puts"
64
+
65
+ # account for both p and puts in the grep..KISS (keeping it simple)
66
+ assert out[:stdout].grep(/in blk with p/m).nitems == 2, "Could not find IO.p"
67
+ end
68
+
69
+ def test_auto_block_with_loaded_code
70
+
71
+ # here we want to ensure that vars set are seen by block
72
+ $global_= '$global test'
73
+
74
+ # stop instance created during setup
75
+ @capture_io.stop
76
+ FileUtils.rm_rf 'io_redirect'
77
+
78
+ code =<<-EOF
79
+ base = File.expand_path(File.dirname(__FILE__))
80
+ require 'platform_helpers'
81
+ require 'capture_io'
82
+ c = CaptureIO.new
83
+ c.start
84
+ p 'in blk with p'
85
+ p "with global: \#{$global_}"
86
+ $new_var=Time.now
87
+ $captured_out = c.stop(delete_tmp=true)
88
+ EOF
89
+
90
+ proc = Proc.new do
91
+ eval code
92
+ end
93
+
94
+ proc.call
95
+
96
+ assert_equal $captured_out[:stdout].grep(/in blk with p/m).nitems, 1, "could not find IO.p"
97
+ assert_equal $captured_out[:stdout].grep(/with global: \$global test/m).nitems, 1, "could not find $global"
98
+
99
+ # test that the var set inside of the code exec by proc is available here
100
+ assert $new_var.kind_of?(Time)
101
+ end
102
+
103
+ # FIXME: update capture_io.rb to handle STDERR
104
+ def ntest_stderr
105
+ expected = 'testing puts'
106
+ $stderr.puts "<TEST_P>#{expected}</TEST_P>"
107
+ # stop capture so we see results
108
+ stderr = @capture_io.stop(delete_tmp=false)[:stderr]
109
+ assert_equal expected, stderr.to_s.scan(/<TEST_P>(.*)<\/TEST_P>/m).to_s
110
+ end
111
+
112
+ def ntest_std_error_auto_block
113
+ raise StandardError, "Testing redefine of stderr"
114
+
115
+ @capture_io.stop(delete_tmp=true)
116
+ assert false, "TODO add test with supporting code in CaptureIO"
117
+ end
118
+
119
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capture_io
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Cliff Cyphers
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-10-02 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: platform_helpers
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: hoe
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: "2.12"
46
+ type: :development
47
+ version_requirements: *id003
48
+ description: Capture STDOUT given a start/stop interface
49
+ email:
50
+ - cliff.cyphers@gmail.com
51
+ executables:
52
+ - capture_io
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - History.txt
57
+ - Manifest.txt
58
+ - README.txt
59
+ files:
60
+ - .autotest
61
+ - History.txt
62
+ - Manifest.txt
63
+ - README.txt
64
+ - Rakefile
65
+ - bin/capture_io
66
+ - lib/capture_io.rb
67
+ - test/test_capture_io.rb
68
+ - .gemtest
69
+ homepage: http://cyberconnect.biz/opensource
70
+ licenses: []
71
+
72
+ post_install_message:
73
+ rdoc_options:
74
+ - --main
75
+ - README.txt
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ requirements: []
91
+
92
+ rubyforge_project: capture_io
93
+ rubygems_version: 1.8.10
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Capture STDOUT given a start/stop interface
97
+ test_files:
98
+ - test/test_capture_io.rb