test-cmd.rb 0.8.0 → 0.9.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
  SHA256:
3
- metadata.gz: 3271a0fc385b5c2ec050a4295cfd9c67b662dca479a1e5c197610fb0f773fb8b
4
- data.tar.gz: da1a24b436cfde2e63a6fccdaf6ac5d597f180f10b578319549713e64992a095
3
+ metadata.gz: 6cce30514a659d318e574a7a8c13de222c8632a4ab944847821195fe512e133a
4
+ data.tar.gz: d5a12184b17454efa414a380006c6f240e6747e13220d3b28940c6cf79e7df33
5
5
  SHA512:
6
- metadata.gz: bf4e1638056aa03ce82db25547efe1ad9c2bbb2ac737a3ec13b9f8c23576c090101b59c19ce7adf554a2b47e9ae16d9fac6439e730c74423a8fe37e317be745d
7
- data.tar.gz: 82c83edc676b854ffa3e96930a6d6b6d51e3ab484df093f1919529e5abc9914e6ff0bc65180733ed0434d48fdee15be93bbe5ff7526e422f2ff57e56c061a4c7
6
+ metadata.gz: e5d88ccede58e0d3f23d226481291aa7c97d64ca1a18ab3d620dee57fbf6590f2e0da1cb62962e8ac328a6a91d80b87d7a525136893e55f5ab9c583e6eda81dc
7
+ data.tar.gz: 6190123fe4136ca820e3c1241a32927ee72be094024abb49d0aaa15be9c6955bccdcc396029b2e035629712bd31a8bc5e221dd9db311422e459ea3a2a253da0e
data/.rubocop.yml CHANGED
@@ -17,3 +17,7 @@ AllCops:
17
17
  Style/MultilineIfModifier:
18
18
  Exclude:
19
19
  - 'lib/test-cmd.rb'
20
+
21
+ Layout/MultilineMethodCallIndentation:
22
+ Exclude:
23
+ - 'test/*.rb'
data/README.md CHANGED
@@ -47,8 +47,8 @@ covers it in more-depth:
47
47
  ``` ruby
48
48
  require "test/cmd"
49
49
  puts cmd("du")
50
- .argv("-s", "-h")
51
- .stdout
50
+ .argv("-s", "-h")
51
+ .stdout
52
52
  ```
53
53
 
54
54
  ### IO#sync
@@ -100,7 +100,7 @@ A complete API reference is available at
100
100
 
101
101
  **Rubygems.org**
102
102
 
103
- test-cmd.rb can be installed via rubygems.org.
103
+ test-cmd.rb can be installed via rubygems.org:
104
104
 
105
105
  gem install test-cmd.rb
106
106
 
data/lib/test/cmd.rb CHANGED
@@ -1 +1,94 @@
1
1
  require_relative "../test-cmd"
2
+
3
+ ##
4
+ # test-cmd.rb provides an object oriented interface
5
+ # for spawning a command.
6
+ class Test::Cmd
7
+ require "tempfile"
8
+
9
+ ##
10
+ # @param [String] cmd
11
+ # A command to spawn
12
+ # @param [Array<String>] argv
13
+ # Zero or more command-line arguments
14
+ # @return [Test::Cmd]
15
+ def initialize(cmd, *argv)
16
+ @cmd = cmd
17
+ @argv = argv.dup
18
+ @status = nil
19
+ @spawned = false
20
+ end
21
+
22
+ ##
23
+ # @param [Array<String, #to_s>] argv
24
+ # Command-line arguments
25
+ # @return [Test::Cmd]
26
+ def argv(*argv)
27
+ tap { @argv.concat(argv) }
28
+ end
29
+
30
+ ##
31
+ # Spawns a command
32
+ # @return [Test::Cmd]
33
+ def spawn
34
+ return if @spawned
35
+
36
+ tap do
37
+ @spawned = true
38
+ @out_io, @err_io = spawn_io
39
+ Process.spawn(@cmd, *@argv, {out: @out_io, err: @err_io})
40
+ Process.wait
41
+ @status = $?
42
+ end
43
+ end
44
+
45
+ ##
46
+ # @return [String]
47
+ # Returns the contents of stdout
48
+ def stdout
49
+ @stdout ||= begin
50
+ spawn
51
+ out_io.tap(&:rewind).read.tap { out_io.close }
52
+ end
53
+ end
54
+
55
+ ##
56
+ # @return [String]
57
+ # Returns the contents of stderr
58
+ def stderr
59
+ @stderr ||= begin
60
+ spawn
61
+ err_io.tap(&:rewind).read.tap { err_io.close }
62
+ end
63
+ end
64
+
65
+ ##
66
+ # @return [Process::Status]
67
+ # Returns the status of a process
68
+ def status
69
+ spawn
70
+ @status
71
+ end
72
+
73
+ ##
74
+ # @return [Integer]
75
+ # Returns the exit status of a process
76
+ def exit_status
77
+ status.exitstatus
78
+ end
79
+
80
+ private
81
+
82
+ attr_reader :out_io, :err_io
83
+
84
+ def spawn_io
85
+ [
86
+ %W[#{object_id} testcmd.out],
87
+ %W[#{object_id} testcmd.err]
88
+ ].map {
89
+ file = Tempfile.new(_1)
90
+ File.chmod(0, file.path)
91
+ file.tap(&:unlink)
92
+ }
93
+ end
94
+ end
data/lib/test-cmd.rb CHANGED
@@ -1,109 +1,11 @@
1
1
  module Test
2
2
  end unless defined?(Test)
3
3
 
4
- ##
5
- # test-cmd.rb is a library for accessing the output streams
6
- # (both stdout and stderr) of a spawned process.
7
- class Test::Cmd
8
- require "tempfile"
9
-
10
- ##
11
- # @param [String] cmd
12
- # A command to spawn.
13
- # @param [Array<String>] argv
14
- # A variable number of command-line arguments.
15
- # @return [Test::Cmd]
16
- def initialize(cmd, *argv)
17
- @cmd = cmd
18
- @argv = argv.dup
19
- @out = unlink!(Tempfile.new("cmd-stdout"))
20
- @err = unlink!(Tempfile.new("cmd-stderr"))
21
- @status = nil
22
- @spawned = false
23
- end
24
-
25
- ##
26
- # @param [Array<String, #to_s>] argv
27
- # One or more command-line arguments.
28
- # @return [Test::Cmd]
29
- def argv(*argv)
30
- tap do
31
- @argv.concat(argv)
32
- end
33
- end
34
-
35
- ##
36
- # Spawns a command.
37
- # @return [Test::Cmd]
38
- def spawn
39
- tap do
40
- @spawned = true
41
- Process.wait Process.spawn(@cmd, *@argv, {out: @out, err: @err})
42
- @status = $?
43
- end
44
- ensure
45
- [stdout,stderr]
46
- end
47
-
48
- ##
49
- # @return [String]
50
- # Returns the contents of stdout.
51
- def stdout
52
- spawn unless @spawned
53
- @stdout ||= @out.tap(&:rewind).read
54
- ensure
55
- @out.close unless @out.closed?
56
- end
57
-
58
- ##
59
- # @return [String]
60
- # Returns the contents of stderr.
61
- def stderr
62
- spawn unless @spawned
63
- @stderr ||= @err.tap(&:rewind).read
64
- ensure
65
- @err.close unless @err.closed?
66
- end
67
-
68
- ##
69
- # @return [Process::Status]
70
- # Returns the status of a process
71
- def status
72
- spawn unless @spawned
73
- @status
74
- end
75
-
76
- ##
77
- # @return [Integer]
78
- # Returns the exit status of a process
79
- def exit_status
80
- status.exitstatus
81
- end
82
-
83
- ##
84
- # @param [Symbol] io
85
- # The output stream as a Symbol (:stdout, :stderr).
86
- # @return [Enumerator]
87
- # Returns an Enumerator when a block is not given.
88
- def each_line(io = :stdout)
89
- return enum_for(:each_line, io) unless block_given?
90
- spawn unless @spawned
91
- public_send(io).each_line { yield(_1) }
92
- end
93
-
94
- private
95
-
96
- ##
97
- # @api private
98
- def unlink!(file)
99
- file.tap do
100
- File.chmod(0, file.path)
101
- file.unlink
102
- end
103
- end
4
+ module Test
5
+ require_relative "test/cmd"
104
6
  end
105
7
 
106
- module Test::Cmd::Mixin
8
+ module Kernel
107
9
  ##
108
10
  # @param (see Test::Cmd#initialize)
109
11
  # @return (see Test::Cmd#initialize)
@@ -111,7 +13,3 @@ module Test::Cmd::Mixin
111
13
  Test::Cmd.new(cmd, *argv)
112
14
  end
113
15
  end
114
-
115
- module Kernel
116
- include Test::Cmd::Mixin
117
- end
@@ -17,6 +17,10 @@ class CmdTest < Test::Unit::TestCase
17
17
  assert_equal 1, cmd("ruby", "-e", "exit 1").exit_status
18
18
  end
19
19
 
20
+ def test_ruby_success_status
21
+ assert_equal true, cmd("ruby", "-e", "exit 0").status.success?
22
+ end
23
+
20
24
  def test_stdout_with_fork
21
25
  code = <<-CODE.each_line.map { _1.chomp.strip }.join(";")
22
26
  $stdout.sync = true
@@ -30,31 +34,6 @@ class CmdTest < Test::Unit::TestCase
30
34
  assert_equal "foo\nbar\n", cmd("ruby", "-e", code).stdout
31
35
  end
32
36
 
33
- def test_each_line_stdout
34
- run = false
35
- cmd("ruby", "-e", "puts 'FooBar'")
36
- .each_line do
37
- run = true
38
- assert_equal "FooBar\n", _1
39
- end
40
- assert run
41
- end
42
-
43
- def test_each_line_stderr
44
- run = false
45
- cmd("ruby", "-e", "warn 'BarFoo'")
46
- .each_line(:stderr) do
47
- run = true
48
- assert_equal "BarFoo\n", _1
49
- end
50
- assert run
51
- end
52
-
53
- def test_each_line_returns_enum
54
- assert_instance_of Enumerator,
55
- cmd("ruby", "-e", "puts 'FooBar'").each_line
56
- end
57
-
58
37
  def test_cmd_with_argv
59
38
  assert_equal "42\n", cmd("ruby")
60
39
  .argv("-e", "warn 42")
data/test-cmd.rb.gemspec CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |gem|
5
5
  gem.authors = ["0x1eef"]
6
6
  gem.email = ["0x1eef@protonmail.com"]
7
7
  gem.homepage = "https://github.com/0x1eef/test-cmd.rb#readme"
8
- gem.version = "0.8.0"
8
+ gem.version = "0.9.0"
9
9
  gem.required_ruby_version = ">= 3.0"
10
10
  gem.licenses = ["0BSD"]
11
11
  gem.files = `git ls-files`.split($/)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-cmd.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - '0x1eef'
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-01 00:00:00.000000000 Z
11
+ date: 2024-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -121,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
123
  requirements: []
124
- rubygems_version: 3.5.3
124
+ rubygems_version: 3.5.9
125
125
  signing_key:
126
126
  specification_version: 4
127
127
  summary: An object-oriented interface for spawning a process.