open4 1.0.1 → 1.3.4
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 +15 -0
- data/LICENSE +3 -0
- data/README +38 -0
- data/README.erb +38 -0
- data/lib/open4.rb +109 -73
- data/open4.gemspec +32 -7
- data/rakefile +394 -0
- data/samples/jesse-caldwell.rb +131 -0
- data/samples/pfork4.rb +24 -0
- data/test/lib/test_case.rb +23 -0
- data/test/pfork4_test.rb +150 -0
- data/test/popen4_test.rb +82 -0
- data/test/popen4ext_test.rb +89 -0
- metadata +35 -38
- data/Rakefile +0 -225
    
        data/test/pfork4_test.rb
    ADDED
    
    | @@ -0,0 +1,150 @@ | |
| 1 | 
            +
            require 'test_case'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Open4
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class PFork4Test < TestCase
         | 
| 6 | 
            +
              def test_fun_successful_return
         | 
| 7 | 
            +
                fun = lambda { 'lucky me' }
         | 
| 8 | 
            +
                cid, _ = pfork4 fun
         | 
| 9 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def test_fun_force_exit
         | 
| 13 | 
            +
                exit_code = 43
         | 
| 14 | 
            +
                fun = lambda { exit! exit_code }
         | 
| 15 | 
            +
                cid, _ = pfork4 fun
         | 
| 16 | 
            +
                assert_equal exit_code, wait_status(cid)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def test_fun_normal_exit
         | 
| 20 | 
            +
                exit_code = 43
         | 
| 21 | 
            +
                fun = lambda { exit exit_code }
         | 
| 22 | 
            +
                cid, _ = pfork4 fun
         | 
| 23 | 
            +
                assert_equal exit_code, wait_status(cid)
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def test_fun_does_not_propagate_exception_without_block
         | 
| 27 | 
            +
                fun = lambda { raise MyError }
         | 
| 28 | 
            +
                cid, _ = pfork4 fun
         | 
| 29 | 
            +
                refute_equal 0, wait_status(cid)
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def test_fun_propagate_exception_with_block
         | 
| 33 | 
            +
                fun = lambda { raise MyError }
         | 
| 34 | 
            +
                assert_raises(MyError) { pfork4(fun) {} }
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def test_fun_propagate_exception_with_block_avoids_zombie_child_process
         | 
| 38 | 
            +
                fun = lambda { raise MyError }
         | 
| 39 | 
            +
                assert_raises(MyError) { pfork4(fun) {} }
         | 
| 40 | 
            +
                assert_empty Process.waitall
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def test_call_block_upon_exception
         | 
| 44 | 
            +
                fun = lambda { raise MyError }
         | 
| 45 | 
            +
                block_called = false
         | 
| 46 | 
            +
                assert_raises(MyError) { pfork4(fun) { block_called = true } }
         | 
| 47 | 
            +
                assert_equal true, block_called
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              def test_passes_child_pid_to_block
         | 
| 51 | 
            +
                fun = lambda { $stdout.write Process.pid }
         | 
| 52 | 
            +
                cid_in_block = nil
         | 
| 53 | 
            +
                cid_in_fun = nil
         | 
| 54 | 
            +
                pfork4(fun) do |cid, _, stdout, _|
         | 
| 55 | 
            +
                  cid_in_block = cid
         | 
| 56 | 
            +
                  cid_in_fun = stdout.read.to_i
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
                assert_equal cid_in_fun, cid_in_block
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def test_io_pipes_without_block
         | 
| 62 | 
            +
                via_msg = 'foo'
         | 
| 63 | 
            +
                err_msg = 'bar'
         | 
| 64 | 
            +
                fun = lambda do
         | 
| 65 | 
            +
                  $stdout.write $stdin.read
         | 
| 66 | 
            +
                  $stderr.write err_msg
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
                out_actual, err_actual = nil, nil
         | 
| 69 | 
            +
                cid, stdin, stdout, stderr = pfork4 fun
         | 
| 70 | 
            +
                stdin.write via_msg
         | 
| 71 | 
            +
                stdin.close
         | 
| 72 | 
            +
                out_actual = stdout.read
         | 
| 73 | 
            +
                err_actual = stderr.read
         | 
| 74 | 
            +
                assert_equal via_msg, out_actual
         | 
| 75 | 
            +
                assert_equal err_msg, err_actual
         | 
| 76 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              def test_io_pipes_with_block
         | 
| 80 | 
            +
                via_msg = 'foo'
         | 
| 81 | 
            +
                err_msg = 'bar'
         | 
| 82 | 
            +
                fun = lambda do
         | 
| 83 | 
            +
                  $stdout.write $stdin.read
         | 
| 84 | 
            +
                  $stderr.write err_msg
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
                out_actual, err_actual = nil, nil
         | 
| 87 | 
            +
                status = pfork4(fun) do |_, stdin, stdout, stderr|
         | 
| 88 | 
            +
                  stdin.write via_msg
         | 
| 89 | 
            +
                  stdin.close
         | 
| 90 | 
            +
                  out_actual = stdout.read
         | 
| 91 | 
            +
                  err_actual = stderr.read
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
                assert_equal via_msg, out_actual
         | 
| 94 | 
            +
                assert_equal err_msg, err_actual
         | 
| 95 | 
            +
                assert_equal 0, status.exitstatus
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              def test_exec_in_fun
         | 
| 99 | 
            +
                via_msg = 'foo'
         | 
| 100 | 
            +
                fun = lambda { exec %{ruby -e "print '#{via_msg}'"} }
         | 
| 101 | 
            +
                out_actual = nil
         | 
| 102 | 
            +
                status = pfork4(fun) do |_, stdin, stdout, _|
         | 
| 103 | 
            +
                  stdin.close
         | 
| 104 | 
            +
                  out_actual = stdout.read
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
                assert_equal via_msg, out_actual
         | 
| 107 | 
            +
                assert_equal 0, status.exitstatus
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              def test_io_pipes_and_then_exception_propagation_with_block
         | 
| 111 | 
            +
                via_msg = 'foo'
         | 
| 112 | 
            +
                err_msg = 'bar'
         | 
| 113 | 
            +
                fun = lambda do
         | 
| 114 | 
            +
                  $stdout.write $stdin.read
         | 
| 115 | 
            +
                  $stderr.write err_msg
         | 
| 116 | 
            +
                  raise MyError
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
                out_actual, err_actual = nil, nil
         | 
| 119 | 
            +
                assert_raises(MyError) do
         | 
| 120 | 
            +
                  pfork4(fun) do |_, stdin, stdout, stderr|
         | 
| 121 | 
            +
                    stdin.write via_msg
         | 
| 122 | 
            +
                    stdin.close
         | 
| 123 | 
            +
                    out_actual = stdout.read
         | 
| 124 | 
            +
                    err_actual = stderr.read
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
                assert_equal via_msg, out_actual
         | 
| 128 | 
            +
                assert_equal err_msg, err_actual
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
              def test_blocked_on_io_read_and_exception_propagation_with_block
         | 
| 132 | 
            +
                fun = lambda do
         | 
| 133 | 
            +
                  $stdin.read
         | 
| 134 | 
            +
                  raise MyError
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
                out_actual, err_actual = nil, nil
         | 
| 137 | 
            +
                assert_raises(MyError) do
         | 
| 138 | 
            +
                  pfork4(fun) do |_, stdin, stdout, stderr|
         | 
| 139 | 
            +
                    stdin.write 'foo'
         | 
| 140 | 
            +
                    stdin.close
         | 
| 141 | 
            +
                    out_actual = stdout.read
         | 
| 142 | 
            +
                    err_actual = stderr.read
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
                end
         | 
| 145 | 
            +
                assert_equal '', out_actual
         | 
| 146 | 
            +
                assert_equal '', err_actual
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
            end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            end
         | 
    
        data/test/popen4_test.rb
    ADDED
    
    | @@ -0,0 +1,82 @@ | |
| 1 | 
            +
            require 'test_case'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Open4
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class POpen4Test < TestCase
         | 
| 6 | 
            +
              UNKNOWN_CMD = 'asdfadsfjlkkk'
         | 
| 7 | 
            +
              UNKNOWN_CMD_ERRORS = [Errno::ENOENT, Errno::EINVAL]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def test_unknown_command_propagates_exception
         | 
| 10 | 
            +
                err = assert_raises(*UNKNOWN_CMD_ERRORS) { popen4 UNKNOWN_CMD }
         | 
| 11 | 
            +
                assert_match(/#{UNKNOWN_CMD}/, err.to_s) if on_mri?
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def test_exception_propagation_avoids_zombie_child_process
         | 
| 15 | 
            +
                assert_raises(*UNKNOWN_CMD_ERRORS) { popen4 UNKNOWN_CMD }
         | 
| 16 | 
            +
                assert_empty Process.waitall
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def test_exit_failure
         | 
| 20 | 
            +
                code = 43
         | 
| 21 | 
            +
                cid, _ = popen4 %{ruby -e "exit #{43}"}
         | 
| 22 | 
            +
                assert_equal code, wait_status(cid)
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def test_exit_success
         | 
| 26 | 
            +
                cid, _ = popen4 %{ruby -e "exit"}
         | 
| 27 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def test_passes_child_pid_to_block
         | 
| 31 | 
            +
                cmd = %{ruby -e "STDOUT.print Process.pid"}
         | 
| 32 | 
            +
                cid_in_block = nil
         | 
| 33 | 
            +
                cid_in_fun = nil
         | 
| 34 | 
            +
                popen4(cmd) do |cid, _, stdout, _|
         | 
| 35 | 
            +
                  cid_in_block = cid
         | 
| 36 | 
            +
                  cid_in_fun = stdout.read.to_i
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
                assert_equal cid_in_fun, cid_in_block
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def test_io_pipes_without_block
         | 
| 42 | 
            +
                via_msg = 'foo'
         | 
| 43 | 
            +
                err_msg = 'bar'
         | 
| 44 | 
            +
                cmd = <<-END
         | 
| 45 | 
            +
            ruby -e "
         | 
| 46 | 
            +
              STDOUT.write STDIN.read
         | 
| 47 | 
            +
              STDERR.write '#{err_msg}'
         | 
| 48 | 
            +
            "
         | 
| 49 | 
            +
                END
         | 
| 50 | 
            +
                cid, stdin, stdout, stderr = popen4 cmd
         | 
| 51 | 
            +
                stdin.write via_msg
         | 
| 52 | 
            +
                stdin.close
         | 
| 53 | 
            +
                out_actual = stdout.read
         | 
| 54 | 
            +
                err_actual = stderr.read
         | 
| 55 | 
            +
                assert_equal via_msg, out_actual
         | 
| 56 | 
            +
                assert_equal err_msg, err_actual
         | 
| 57 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              def test_io_pipes_with_block
         | 
| 61 | 
            +
                via_msg = 'foo'
         | 
| 62 | 
            +
                err_msg = 'bar'
         | 
| 63 | 
            +
                out_actual, err_actual = nil
         | 
| 64 | 
            +
                cmd = <<-END
         | 
| 65 | 
            +
            ruby -e "
         | 
| 66 | 
            +
              STDOUT.write STDIN.read
         | 
| 67 | 
            +
              STDERR.write '#{err_msg}'
         | 
| 68 | 
            +
            "
         | 
| 69 | 
            +
                END
         | 
| 70 | 
            +
                status = popen4(cmd) do |_, stdin, stdout, stderr|
         | 
| 71 | 
            +
                  stdin.write via_msg
         | 
| 72 | 
            +
                  stdin.close
         | 
| 73 | 
            +
                  out_actual = stdout.read
         | 
| 74 | 
            +
                  err_actual = stderr.read
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
                assert_equal via_msg, out_actual
         | 
| 77 | 
            +
                assert_equal err_msg, err_actual
         | 
| 78 | 
            +
                assert_equal 0, status.exitstatus
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            end
         | 
| @@ -0,0 +1,89 @@ | |
| 1 | 
            +
            require 'test_case'
         | 
| 2 | 
            +
            require 'socket'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Open4
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            class POpen4Test < TestCase
         | 
| 7 | 
            +
              UNKNOWN_CMD = 'asdfadsfjlkkk'
         | 
| 8 | 
            +
              UNKNOWN_CMD_ERRORS = [Errno::ENOENT, Errno::EINVAL]
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def test_unknown_command_propagates_exception
         | 
| 11 | 
            +
                err = assert_raises(*UNKNOWN_CMD_ERRORS) { popen4ext true, UNKNOWN_CMD }
         | 
| 12 | 
            +
                assert_match(/#{UNKNOWN_CMD}/, err.to_s) if on_mri?
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def test_exception_propagation_avoids_zombie_child_process
         | 
| 16 | 
            +
                assert_raises(*UNKNOWN_CMD_ERRORS) { popen4ext true, UNKNOWN_CMD }
         | 
| 17 | 
            +
                assert_empty Process.waitall
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def test_exit_failure
         | 
| 21 | 
            +
                code = 43
         | 
| 22 | 
            +
                cid, _ = popen4ext true, %{ruby -e "exit #{43}"}
         | 
| 23 | 
            +
                assert_equal code, wait_status(cid)
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def test_exit_success
         | 
| 27 | 
            +
                cid, _ = popen4ext true, %{ruby -e "exit"}
         | 
| 28 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def test_passes_child_pid_to_block
         | 
| 32 | 
            +
                cmd = %{ruby -e "STDOUT.print Process.pid"}
         | 
| 33 | 
            +
                cid_in_block = nil
         | 
| 34 | 
            +
                cid_in_fun = nil
         | 
| 35 | 
            +
                popen4ext(true, cmd) do |cid, _, stdout, _|
         | 
| 36 | 
            +
                  cid_in_block = cid
         | 
| 37 | 
            +
                  cid_in_fun = stdout.read.to_i
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
                assert_equal cid_in_fun, cid_in_block
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              def test_io_pipes_without_block
         | 
| 43 | 
            +
                via_msg = 'foo'
         | 
| 44 | 
            +
                err_msg = 'bar'
         | 
| 45 | 
            +
                cmd = <<-END
         | 
| 46 | 
            +
            ruby -e "
         | 
| 47 | 
            +
              STDOUT.write STDIN.read
         | 
| 48 | 
            +
              STDERR.write '#{err_msg}'
         | 
| 49 | 
            +
            "
         | 
| 50 | 
            +
                END
         | 
| 51 | 
            +
                cid, stdin, stdout, stderr = popen4ext true, cmd
         | 
| 52 | 
            +
                stdin.write via_msg
         | 
| 53 | 
            +
                stdin.close
         | 
| 54 | 
            +
                out_actual = stdout.read
         | 
| 55 | 
            +
                err_actual = stderr.read
         | 
| 56 | 
            +
                assert_equal via_msg, out_actual
         | 
| 57 | 
            +
                assert_equal err_msg, err_actual
         | 
| 58 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def test_io_pipes_with_block
         | 
| 62 | 
            +
                via_msg = 'foo'
         | 
| 63 | 
            +
                err_msg = 'bar'
         | 
| 64 | 
            +
                out_actual, err_actual = nil
         | 
| 65 | 
            +
                cmd = <<-END
         | 
| 66 | 
            +
            ruby -e "
         | 
| 67 | 
            +
              STDOUT.write STDIN.read
         | 
| 68 | 
            +
              STDERR.write '#{err_msg}'
         | 
| 69 | 
            +
            "
         | 
| 70 | 
            +
                END
         | 
| 71 | 
            +
                status = popen4ext(true, cmd) do |_, stdin, stdout, stderr|
         | 
| 72 | 
            +
                  stdin.write via_msg
         | 
| 73 | 
            +
                  stdin.close
         | 
| 74 | 
            +
                  out_actual = stdout.read
         | 
| 75 | 
            +
                  err_actual = stderr.read
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
                assert_equal via_msg, out_actual
         | 
| 78 | 
            +
                assert_equal err_msg, err_actual
         | 
| 79 | 
            +
                assert_equal 0, status.exitstatus
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              def test_close_ignores_errors
         | 
| 83 | 
            +
                TCPSocket.new('localhost', 59367).close rescue nil
         | 
| 84 | 
            +
                cid, _ = popen4ext true, %{ruby -e "exit"}
         | 
| 85 | 
            +
                assert_equal 0, wait_status(cid)
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
            end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,67 +1,64 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: open4
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 4 | 
            -
              version: 1. | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 1.3.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 | 
            -
            authors: | 
| 6 | 
            +
            authors:
         | 
| 7 7 | 
             
            - Ara T. Howard
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            date: 2009-10-18 00:00:00 -06:00
         | 
| 13 | 
            -
            default_executable: 
         | 
| 11 | 
            +
            date: 2014-05-15 00:00:00.000000000 Z
         | 
| 14 12 | 
             
            dependencies: []
         | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 13 | 
            +
            description: ! 'open child process with handles on pid, stdin, stdout, and stderr:
         | 
| 14 | 
            +
              manage child processes and their io handles easily.'
         | 
| 17 15 | 
             
            email: ara.t.howard@gmail.com
         | 
| 18 16 | 
             
            executables: []
         | 
| 19 | 
            -
             | 
| 20 17 | 
             
            extensions: []
         | 
| 21 | 
            -
             | 
| 22 18 | 
             
            extra_rdoc_files: []
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
            - lib/open4.rb
         | 
| 26 | 
            -
            - open4.gemspec
         | 
| 27 | 
            -
            - Rakefile
         | 
| 19 | 
            +
            files:
         | 
| 20 | 
            +
            - LICENSE
         | 
| 28 21 | 
             
            - README
         | 
| 29 22 | 
             
            - README.erb
         | 
| 23 | 
            +
            - lib/open4.rb
         | 
| 24 | 
            +
            - open4.gemspec
         | 
| 25 | 
            +
            - rakefile
         | 
| 30 26 | 
             
            - samples/bg.rb
         | 
| 31 27 | 
             
            - samples/block.rb
         | 
| 32 28 | 
             
            - samples/exception.rb
         | 
| 29 | 
            +
            - samples/jesse-caldwell.rb
         | 
| 30 | 
            +
            - samples/pfork4.rb
         | 
| 33 31 | 
             
            - samples/simple.rb
         | 
| 34 32 | 
             
            - samples/spawn.rb
         | 
| 35 33 | 
             
            - samples/stdin_timeout.rb
         | 
| 36 34 | 
             
            - samples/timeout.rb
         | 
| 35 | 
            +
            - test/lib/test_case.rb
         | 
| 36 | 
            +
            - test/pfork4_test.rb
         | 
| 37 | 
            +
            - test/popen4_test.rb
         | 
| 38 | 
            +
            - test/popen4ext_test.rb
         | 
| 37 39 | 
             
            - white_box/leak.rb
         | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 40 | 
            +
            homepage: https://github.com/ahoward/open4
         | 
| 41 | 
            +
            licenses:
         | 
| 42 | 
            +
            - Ruby
         | 
| 43 | 
            +
            metadata: {}
         | 
| 42 44 | 
             
            post_install_message: 
         | 
| 43 45 | 
             
            rdoc_options: []
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            require_paths: 
         | 
| 46 | 
            +
            require_paths:
         | 
| 46 47 | 
             
            - lib
         | 
| 47 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 48 | 
            -
              requirements: | 
| 49 | 
            -
              - -  | 
| 50 | 
            -
                - !ruby/object:Gem::Version | 
| 51 | 
            -
                  version:  | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
               | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
                  version: "0"
         | 
| 58 | 
            -
              version: 
         | 
| 48 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 49 | 
            +
              requirements:
         | 
| 50 | 
            +
              - - ! '>='
         | 
| 51 | 
            +
                - !ruby/object:Gem::Version
         | 
| 52 | 
            +
                  version: '0'
         | 
| 53 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 54 | 
            +
              requirements:
         | 
| 55 | 
            +
              - - ! '>='
         | 
| 56 | 
            +
                - !ruby/object:Gem::Version
         | 
| 57 | 
            +
                  version: '0'
         | 
| 59 58 | 
             
            requirements: []
         | 
| 60 | 
            -
             | 
| 61 59 | 
             
            rubyforge_project: codeforpeople
         | 
| 62 | 
            -
            rubygems_version:  | 
| 60 | 
            +
            rubygems_version: 2.0.3
         | 
| 63 61 | 
             
            signing_key: 
         | 
| 64 | 
            -
            specification_version:  | 
| 62 | 
            +
            specification_version: 4
         | 
| 65 63 | 
             
            summary: open4
         | 
| 66 64 | 
             
            test_files: []
         | 
| 67 | 
            -
             | 
    
        data/Rakefile
    DELETED
    
    | @@ -1,225 +0,0 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
            This.rubyforge_project = 'codeforpeople'
         | 
| 3 | 
            -
            This.author = "Ara T. Howard"
         | 
| 4 | 
            -
            This.email = "ara.t.howard@gmail.com"
         | 
| 5 | 
            -
            This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
            task :default do
         | 
| 9 | 
            -
              puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
         | 
| 10 | 
            -
            end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
            task :gemspec do
         | 
| 14 | 
            -
              ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
         | 
| 15 | 
            -
              ignore_directories = 'pkg'
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              shiteless = 
         | 
| 18 | 
            -
                lambda do |list|
         | 
| 19 | 
            -
                  list.delete_if do |entry|
         | 
| 20 | 
            -
                    next unless test(?e, entry)
         | 
| 21 | 
            -
                    extension = File.basename(entry).split(%r/[.]/).last
         | 
| 22 | 
            -
                    ignore_extensions.any?{|ext| ext === extension}
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                  list.delete_if do |entry|
         | 
| 25 | 
            -
                    next unless test(?d, entry)
         | 
| 26 | 
            -
                    dirname = File.expand_path(entry)
         | 
| 27 | 
            -
                    ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              lib         = This.lib
         | 
| 32 | 
            -
              version     = This.version
         | 
| 33 | 
            -
              files       = shiteless[Dir::glob("**/**")]
         | 
| 34 | 
            -
              executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
         | 
| 35 | 
            -
              has_rdoc    = true #File.exist?('doc')
         | 
| 36 | 
            -
              test_files  = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
         | 
| 37 | 
            -
             | 
| 38 | 
            -
              extensions = This.extensions
         | 
| 39 | 
            -
              if extensions.nil?
         | 
| 40 | 
            -
                %w( Makefile configure extconf.rb ).each do |ext|
         | 
| 41 | 
            -
                  extensions << ext if File.exists?(ext)
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
              extensions = [extensions].flatten.compact
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              template = 
         | 
| 47 | 
            -
                if test(?e, 'gemspec.erb')
         | 
| 48 | 
            -
                  Template{ IO.read('gemspec.erb') }
         | 
| 49 | 
            -
                else
         | 
| 50 | 
            -
                  Template {
         | 
| 51 | 
            -
                    <<-__
         | 
| 52 | 
            -
                      ## #{ lib }.gemspec
         | 
| 53 | 
            -
                      #
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                      Gem::Specification::new do |spec|
         | 
| 56 | 
            -
                        spec.name = #{ lib.inspect }
         | 
| 57 | 
            -
                        spec.version = #{ version.inspect }
         | 
| 58 | 
            -
                        spec.platform = Gem::Platform::RUBY
         | 
| 59 | 
            -
                        spec.summary = #{ lib.inspect }
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                        spec.description = "manage child processes and their io handles easily"
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                        spec.files = #{ files.inspect }
         | 
| 64 | 
            -
                        spec.executables = #{ executables.inspect }
         | 
| 65 | 
            -
                        
         | 
| 66 | 
            -
                        spec.require_path = "lib"
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                        spec.has_rdoc = #{ has_rdoc.inspect }
         | 
| 69 | 
            -
                        spec.test_files = #{ test_files.inspect }
         | 
| 70 | 
            -
                        #spec.add_dependency 'lib', '>= version'
         | 
| 71 | 
            -
                        #spec.add_dependency 'fattr'
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                        spec.extensions.push(*#{ extensions.inspect })
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                        spec.rubyforge_project = #{ This.rubyforge_project.inspect }
         | 
| 76 | 
            -
                        spec.author = #{ This.author.inspect }
         | 
| 77 | 
            -
                        spec.email = #{ This.email.inspect }
         | 
| 78 | 
            -
                        spec.homepage = #{ This.homepage.inspect }
         | 
| 79 | 
            -
                      end
         | 
| 80 | 
            -
                    __
         | 
| 81 | 
            -
                  }
         | 
| 82 | 
            -
                end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
              open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
         | 
| 85 | 
            -
              This.gemspec = "#{ lib }.gemspec"
         | 
| 86 | 
            -
            end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
            task :gem => [:clean, :gemspec] do
         | 
| 89 | 
            -
              Fu.mkdir_p This.pkgdir
         | 
| 90 | 
            -
              before = Dir['*.gem']
         | 
| 91 | 
            -
              cmd = "gem build #{ This.gemspec }"
         | 
| 92 | 
            -
              `#{ cmd }`
         | 
| 93 | 
            -
              after = Dir['*.gem']
         | 
| 94 | 
            -
              gem = ((after - before).first || after.first) or abort('no gem!')
         | 
| 95 | 
            -
              Fu.mv gem, This.pkgdir
         | 
| 96 | 
            -
              This.gem = File.basename(gem)
         | 
| 97 | 
            -
            end
         | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
            task :readme do
         | 
| 101 | 
            -
              samples = ''
         | 
| 102 | 
            -
              prompt = '~ > '
         | 
| 103 | 
            -
              lib = This.lib
         | 
| 104 | 
            -
              version = This.version
         | 
| 105 | 
            -
             | 
| 106 | 
            -
              Dir['sample*/*'].sort.each do |sample|
         | 
| 107 | 
            -
                samples << "\n" << "  <========< #{ sample } >========>" << "\n\n"
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                cmd = "cat #{ sample }"
         | 
| 110 | 
            -
                samples << Util.indent(prompt + cmd, 2) << "\n\n"
         | 
| 111 | 
            -
                samples << Util.indent(`#{ cmd }`, 4) << "\n"
         | 
| 112 | 
            -
             | 
| 113 | 
            -
                cmd = "ruby #{ sample }"
         | 
| 114 | 
            -
                samples << Util.indent(prompt + cmd, 2) << "\n\n"
         | 
| 115 | 
            -
             | 
| 116 | 
            -
                cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
         | 
| 117 | 
            -
                samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
         | 
| 118 | 
            -
              end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
              template = 
         | 
| 121 | 
            -
                if test(?e, 'readme.erb')
         | 
| 122 | 
            -
                  Template{ IO.read('readme.erb') }
         | 
| 123 | 
            -
                else
         | 
| 124 | 
            -
                  Template {
         | 
| 125 | 
            -
                    <<-__
         | 
| 126 | 
            -
                      NAME
         | 
| 127 | 
            -
                        #{ lib }
         | 
| 128 | 
            -
             | 
| 129 | 
            -
                      DESCRIPTION
         | 
| 130 | 
            -
             | 
| 131 | 
            -
                      INSTALL
         | 
| 132 | 
            -
                        gem install #{ lib }
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                      SAMPLES
         | 
| 135 | 
            -
                        #{ samples }
         | 
| 136 | 
            -
                    __
         | 
| 137 | 
            -
                  }
         | 
| 138 | 
            -
                end
         | 
| 139 | 
            -
             | 
| 140 | 
            -
              open("README", "w"){|fd| fd.puts template}
         | 
| 141 | 
            -
            end
         | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
            task :clean do
         | 
| 145 | 
            -
              Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
         | 
| 146 | 
            -
            end
         | 
| 147 | 
            -
             | 
| 148 | 
            -
             | 
| 149 | 
            -
            task :release => [:clean, :gemspec, :gem] do
         | 
| 150 | 
            -
              gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
         | 
| 151 | 
            -
              raise "which one? : #{ gems.inspect }" if gems.size > 1
         | 
| 152 | 
            -
              raise "no gems?" if gems.size < 1
         | 
| 153 | 
            -
              cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.pkgdir }/#{ This.gem }"
         | 
| 154 | 
            -
              puts cmd
         | 
| 155 | 
            -
              system cmd
         | 
| 156 | 
            -
            end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
            BEGIN {
         | 
| 163 | 
            -
              $VERBOSE = nil
         | 
| 164 | 
            -
             | 
| 165 | 
            -
              require 'ostruct'
         | 
| 166 | 
            -
              require 'erb'
         | 
| 167 | 
            -
              require 'fileutils'
         | 
| 168 | 
            -
             | 
| 169 | 
            -
              Fu = FileUtils
         | 
| 170 | 
            -
             | 
| 171 | 
            -
              This = OpenStruct.new
         | 
| 172 | 
            -
             | 
| 173 | 
            -
              This.file = File.expand_path(__FILE__)
         | 
| 174 | 
            -
              This.dir = File.dirname(This.file)
         | 
| 175 | 
            -
              This.pkgdir = File.join(This.dir, 'pkg')
         | 
| 176 | 
            -
             | 
| 177 | 
            -
              lib = ENV['LIB']
         | 
| 178 | 
            -
              unless lib
         | 
| 179 | 
            -
                lib = File.basename(Dir.pwd)
         | 
| 180 | 
            -
              end
         | 
| 181 | 
            -
              This.lib = lib
         | 
| 182 | 
            -
             | 
| 183 | 
            -
              version = ENV['VERSION']
         | 
| 184 | 
            -
              unless version
         | 
| 185 | 
            -
                name = lib.capitalize
         | 
| 186 | 
            -
                require "./lib/#{ lib }"
         | 
| 187 | 
            -
                version = eval(name).send(:version)
         | 
| 188 | 
            -
              end
         | 
| 189 | 
            -
              This.version = version
         | 
| 190 | 
            -
             | 
| 191 | 
            -
              abort('no lib') unless This.lib
         | 
| 192 | 
            -
              abort('no version') unless This.version
         | 
| 193 | 
            -
             | 
| 194 | 
            -
              module Util
         | 
| 195 | 
            -
                def indent(s, n = 2)
         | 
| 196 | 
            -
                  s = unindent(s)
         | 
| 197 | 
            -
                  ws = ' ' * n
         | 
| 198 | 
            -
                  s.gsub(%r/^/, ws)
         | 
| 199 | 
            -
                end
         | 
| 200 | 
            -
             | 
| 201 | 
            -
                def unindent(s)
         | 
| 202 | 
            -
                  indent = nil
         | 
| 203 | 
            -
                  s.each do |line|
         | 
| 204 | 
            -
                  next if line =~ %r/^\s*$/
         | 
| 205 | 
            -
                  indent = line[%r/^\s*/] and break
         | 
| 206 | 
            -
                end
         | 
| 207 | 
            -
                indent ? s.gsub(%r/^#{ indent }/, "") : s
         | 
| 208 | 
            -
              end
         | 
| 209 | 
            -
                extend self
         | 
| 210 | 
            -
              end
         | 
| 211 | 
            -
             | 
| 212 | 
            -
              class Template
         | 
| 213 | 
            -
                def initialize(&block)
         | 
| 214 | 
            -
                  @block = block
         | 
| 215 | 
            -
                  @template = block.call.to_s
         | 
| 216 | 
            -
                end
         | 
| 217 | 
            -
                def expand(b=nil)
         | 
| 218 | 
            -
                  ERB.new(Util.unindent(@template)).result(b||@block)
         | 
| 219 | 
            -
                end
         | 
| 220 | 
            -
                alias_method 'to_s', 'expand'
         | 
| 221 | 
            -
              end
         | 
| 222 | 
            -
              def Template(*args, &block) Template.new(*args, &block) end
         | 
| 223 | 
            -
             | 
| 224 | 
            -
              Dir.chdir(This.dir)
         | 
| 225 | 
            -
            }
         |