test-cmd.rb 0.5.2 → 0.7.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
  SHA256:
3
- metadata.gz: c2396593840d674fad470e2e4fcb0f0fc74e55987fe5caec27128457b0608453
4
- data.tar.gz: 3b6c43870258be5d3c0a1039e5e8436bff314ea05c03dab2866593dafbf43591
3
+ metadata.gz: 4a40537381e81f677332c21cfbc95b997fe0f89a4cbf4c714e2eb857da496554
4
+ data.tar.gz: 88ceffc1c05ed2b90f79c39c73c6a95adc5ccd9bce97ff435dea3dbea07feb89
5
5
  SHA512:
6
- metadata.gz: edb9931271bfc62a1c22be0717659fa83a670652b97ef7ebe74fe98e2605b21fc4c87647c75aa20c4913a8a76e6bd1d3de7a3d28fe74f75d800293844c2b442e
7
- data.tar.gz: 3f95d41e84bb4ddf323798dee95e33872e72ff32869f3c1d82f629c00e1b15e840fd93b504f5fd15c7cfa4aa4dd280da172f7edeffd017ec3b486ce7dd2d8ea3
6
+ metadata.gz: 362b5b2155218c63f01321c279ebb5a7cd204fbdb01af2e76ce3d767d30c4b3a13c2a2eec52de77f7bb80419d37f7fdadb44ce1c3fb97e42d708d916a0eedfa1
7
+ data.tar.gz: 055f87c0d765be7ec2612ba9ae3e0f49cdaf2458eac747c8399b8b57dda732dca20d4848d9cc6809393fb3dfbd295cf2d55aec50eee9fbec7f8a63d37ef8a466
data/README.md CHANGED
@@ -1,11 +1,7 @@
1
1
  ## About
2
2
 
3
- test-cmd.rb is a library for accessing the output streams
4
- (both stdout and stderr) of a spawned process. The library was
5
- first realized in a test environment, where it provided a path
6
- for verifying that when code examples are run they produce the
7
- expected output. The library can be generally useful outside a
8
- test environment, too.
3
+ test-cmd.rb provides an object-oriented interface for spawning
4
+ a process.
9
5
 
10
6
  ## Examples
11
7
 
@@ -14,7 +10,7 @@ test environment, too.
14
10
  The following example demonstrates how tests might be written with
15
11
  test-unit from the standard library. The
16
12
  [`cmd`](https://0x1eef.github.io/x/test-cmd.rb/Test/CmdMixin.html#cmd-instance_method)
17
- method is given the name of a command, along with any arguments:
13
+ method takes the name or path of a command, alongside any arguments:
18
14
 
19
15
  ```ruby
20
16
  require "test/unit"
@@ -22,19 +18,19 @@ require "test/cmd"
22
18
 
23
19
  class CmdTest < Test::Unit::TestCase
24
20
  def test_ruby_stdout
25
- assert_equal "foo\n", cmd(%q(ruby -e '$stdout.puts "foo"')).stdout
21
+ assert_equal "42\n", cmd("ruby", "-e", "puts 42").stdout
26
22
  end
27
23
 
28
24
  def test_ruby_stderr
29
- assert_equal "bar\n", cmd(%q(ruby -e '$stderr.puts "bar"')).stderr
25
+ assert_equal "42\n", cmd("ruby", "-e", "warn 42").stderr
30
26
  end
31
27
 
32
28
  def test_ruby_success_exit_status
33
- assert_equal 0, cmd(%q(ruby -e 'exit 0')).exit_status
29
+ assert_equal 0, cmd("ruby", "-e", "exit 0").exit_status
34
30
  end
35
31
 
36
32
  def test_ruby_failure_exit_status
37
- assert_equal 1, cmd(%q(ruby -e 'exit 1')).exit_status
33
+ assert_equal 1, cmd("ruby", "-e", "exit 1").exit_status
38
34
  end
39
35
  end
40
36
  ```
@@ -50,10 +46,9 @@ covers it in more-depth:
50
46
 
51
47
  ``` ruby
52
48
  require "test/cmd"
53
- str = cmd("du")
54
- .arg("-s").arg("-h")
55
- .spawn.stdout
56
- puts str
49
+ puts cmd("du")
50
+ .args("-s", "-h")
51
+ .stdout
57
52
  ```
58
53
 
59
54
  ### IO#sync
@@ -75,7 +70,7 @@ Process.wait(pid)
75
70
 
76
71
  ##
77
72
  # cmd.rb
78
- p cmd("ruby test.rb").stdout # => "bar\nfoo\n"
73
+ p cmd("ruby", "test.rb").stdout # => "bar\nfoo\n"
79
74
  ```
80
75
 
81
76
  And with output flushed to the operating system immediately:
@@ -93,36 +88,29 @@ Process.wait(pid)
93
88
 
94
89
  ##
95
90
  # cmd.rb
96
- p cmd("ruby test.rb").stdout # => "foo\nbar\n"
91
+ p cmd("ruby", "test.rb").stdout # => "foo\nbar\n"
97
92
  ```
98
93
 
99
- ## Sources
94
+ ## Documentation
100
95
 
101
- * [Source code (GitHub)](https://github.com/0x1eef/test-cmd.rb#readme)
102
- * [Source code (GitLab)](https://gitlab.com/0x1eef/test-cmd.rb#about)
96
+ A complete API reference is available at
97
+ [0x1eef.github.io/x/test-cmd.rb](https://0x1eef.github.io/x/test-cmd.rb).
103
98
 
104
99
  ## Install
105
100
 
106
- test-cmd.rb is distributed as a RubyGem through its git repositories. <br>
107
- [GitHub](https://github.com/0x1eef/test-cmd.rb),
108
- and
109
- [GitLab](https://gitlab.com/0x1eef/test-cmd.rb)
110
- are available as sources.
111
-
112
- ``` ruby
113
- # Gemfile
114
- gem "test-cmd.rb", github: "0x1eef/test-cmd.rb", tag: "v0.5.2"
115
- ```
116
-
117
101
  **Rubygems.org**
118
102
 
119
- test-cmd.rb can also be installed via rubygems.org.
103
+ test-cmd.rb can be installed via rubygems.org.
120
104
 
121
105
  gem install test-cmd.rb
122
106
 
107
+ ## Sources
108
+
109
+ * [GitHub](https://github.com/0x1eef/test-cmd.rb#readme)
110
+ * [GitLab](https://gitlab.com/0x1eef/test-cmd.rb#about)
111
+
123
112
  ## License
124
113
 
125
114
  [BSD Zero Clause](https://choosealicense.com/licenses/0bsd/).
126
115
  <br>
127
116
  See [LICENSE](./LICENSE).
128
-
data/lib/test-cmd.rb CHANGED
@@ -3,23 +3,19 @@ end unless defined?(Test)
3
3
 
4
4
  ##
5
5
  # test-cmd.rb is a library for accessing the output streams
6
- # (both stdout and stderr) of a spawned process. The library was
7
- # first realized in a test environment, where it provided a path
8
- # for verifying that when code examples are run they produce the
9
- # expected output. The library can be generally useful outside a
10
- # test environment, too.
6
+ # (both stdout and stderr) of a spawned process.
11
7
  class Test::Cmd
12
8
  require "tempfile"
13
9
 
14
10
  ##
15
11
  # @param [String] cmd
16
12
  # A command to spawn.
17
- # @param [Array<String>] args
18
- # An array of command-line arguments.
13
+ # @param [Array<String>] argv
14
+ # A variable number of command-line arguments.
19
15
  # @return [Test::Cmd]
20
- def initialize(cmd, args = [])
16
+ def initialize(cmd, *argv)
21
17
  @cmd = cmd
22
- @args = args.dup
18
+ @argv = argv.dup
23
19
  @out = unlink!(Tempfile.new("cmd-stdout"))
24
20
  @err = unlink!(Tempfile.new("cmd-stderr"))
25
21
  @status = nil
@@ -32,17 +28,17 @@ class Test::Cmd
32
28
  # @return [Test::Cmd]
33
29
  def arg(arg)
34
30
  tap do
35
- @args.push(arg)
31
+ @argv.push(arg)
36
32
  end
37
33
  end
38
34
 
39
35
  ##
40
- # @param [Array<String, #to_s>] args
36
+ # @param [Array<String, #to_s>] argv
41
37
  # One or more command-line arguments.
42
38
  # @return [Test::Cmd]
43
- def args(*args)
39
+ def args(*argv)
44
40
  tap do
45
- @args.concat(args)
41
+ @argv.concat(argv)
46
42
  end
47
43
  end
48
44
 
@@ -52,7 +48,7 @@ class Test::Cmd
52
48
  def spawn
53
49
  tap do
54
50
  @spawned = true
55
- Process.wait Process.spawn(@cmd, *@args, {out: @out, err: @err})
51
+ Process.wait Process.spawn(@cmd, *@argv, {out: @out, err: @err})
56
52
  @status = $?
57
53
  end
58
54
  ensure
@@ -79,7 +75,8 @@ class Test::Cmd
79
75
  @err.close unless @err.closed?
80
76
  end
81
77
 
82
- ## @return [Process::Status]
78
+ ##
79
+ # @return [Process::Status]
83
80
  # Returns the status of a process
84
81
  def status
85
82
  spawn unless @spawned
@@ -94,16 +91,14 @@ class Test::Cmd
94
91
  end
95
92
 
96
93
  ##
97
- # Yields each line of stdout when the command
98
- # was successful, or each line of stderr when
99
- # the command was not successful.
94
+ # @param [Symbol] io
95
+ # The output stream as a Symbol (:stdout, :stderr).
100
96
  # @return [Enumerator]
101
97
  # Returns an Enumerator when a block is not given.
102
- def each_line
103
- return enum_for(:each_line) unless block_given?
98
+ def each_line(io = :stdout)
99
+ return enum_for(:each_line, io) unless block_given?
104
100
  spawn unless @spawned
105
- io = @status.success? ? @stdout : @stderr
106
- io.each_line.each { yield(_1.chomp) }
101
+ public_send(io).each_line { yield(_1) }
107
102
  end
108
103
 
109
104
  private
@@ -112,25 +107,21 @@ class Test::Cmd
112
107
  # @api private
113
108
  def unlink!(file)
114
109
  file.tap do
115
- File.chmod(0000, file.path)
110
+ File.chmod(0, file.path)
116
111
  file.unlink
117
112
  end
118
113
  end
119
114
  end
120
115
 
121
- module Test::CmdMixin
116
+ module Test::Cmd::Mixin
122
117
  ##
123
- # @param [String] cmd
124
- # A command to execute
125
- # @param [Array<String>] args
126
- # An array of command-line arguments.
127
- # @return [Test::Cmd]
128
- # Returns an instance of {Test::Cmd Test::Cmd}
129
- def cmd(cmd, args = [])
130
- Test::Cmd.new(cmd, args)
118
+ # @param (see Test::Cmd#initialize)
119
+ # @return (see Test::Cmd#initialize)
120
+ def cmd(cmd, *argv)
121
+ Test::Cmd.new(cmd, *argv)
131
122
  end
132
123
  end
133
124
 
134
125
  module Kernel
135
- include Test::CmdMixin
126
+ include Test::Cmd::Mixin
136
127
  end
@@ -2,19 +2,19 @@ require_relative "setup"
2
2
 
3
3
  class CmdTest < Test::Unit::TestCase
4
4
  def test_ruby_stdout
5
- assert_equal "foo\n", cmd(%q(ruby -e '$stdout.puts "foo"')).stdout
5
+ assert_equal "42\n", cmd("ruby", "-e", "puts 42").stdout
6
6
  end
7
7
 
8
8
  def test_ruby_stderr
9
- assert_equal "bar\n", cmd(%q(ruby -e '$stderr.puts "bar"')).stderr
9
+ assert_equal "42\n", cmd("ruby", "-e", "warn 42").stderr
10
10
  end
11
11
 
12
12
  def test_ruby_success_exit_status
13
- assert_equal 0, cmd(%q(ruby -e 'exit 0')).exit_status
13
+ assert_equal 0, cmd("ruby", "-e", "exit 0").exit_status
14
14
  end
15
15
 
16
16
  def test_ruby_failure_exit_status
17
- assert_equal 1, cmd(%q(ruby -e 'exit 1')).exit_status
17
+ assert_equal 1, cmd("ruby", "-e", "exit 1").exit_status
18
18
  end
19
19
 
20
20
  def test_stdout_with_fork
@@ -27,21 +27,31 @@ class CmdTest < Test::Unit::TestCase
27
27
  puts "foo"
28
28
  Process.wait(pid)
29
29
  CODE
30
- assert_equal "foo\nbar\n", cmd(%Q(ruby -e '#{code}')).stdout
30
+ assert_equal "foo\nbar\n", cmd("ruby", "-e", code).stdout
31
31
  end
32
32
 
33
33
  def test_each_line_stdout
34
34
  run = false
35
- cmd(%q(ruby -e '$stdout.puts "FooBar"'))
35
+ cmd("ruby", "-e", "puts 'FooBar'")
36
36
  .each_line do
37
37
  run = true
38
- assert_equal _1, "FooBar"
38
+ assert_equal "FooBar\n", _1
39
39
  end
40
- assert_equal true, run
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
41
51
  end
42
52
 
43
53
  def test_each_line_returns_enum
44
54
  assert_instance_of Enumerator,
45
- cmd(%q(ruby -e '$stdout.puts "FooBar"')).each_line
55
+ cmd("ruby", "-e", "puts 'FooBar'").each_line
46
56
  end
47
57
  end
data/test-cmd.rb.gemspec CHANGED
@@ -5,13 +5,12 @@ 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.5.2"
8
+ gem.version = "0.7.0"
9
9
  gem.required_ruby_version = ">= 3.0"
10
10
  gem.licenses = ["0BSD"]
11
11
  gem.files = `git ls-files`.split($/)
12
12
  gem.require_paths = ["lib"]
13
- gem.summary = "test-cmd.rb provides access to the output streams " \
14
- "(both stdout and stderr) of a spawned process."
13
+ gem.summary = "An object-oriented interface for spawning a process."
15
14
  gem.metadata = { "documentation_uri" => "https://0x1eef.github.io/x/test-cmd.rb/" }
16
15
  gem.description = gem.summary
17
16
  gem.add_development_dependency "test-unit", "~> 3.5.7"
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.5.2
4
+ version: 0.7.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-02-01 00:00:00.000000000 Z
11
+ date: 2024-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -80,8 +80,7 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '13.1'
83
- description: test-cmd.rb provides access to the output streams (both stdout and stderr)
84
- of a spawned process.
83
+ description: An object-oriented interface for spawning a process.
85
84
  email:
86
85
  - 0x1eef@protonmail.com
87
86
  executables: []
@@ -125,6 +124,5 @@ requirements: []
125
124
  rubygems_version: 3.5.3
126
125
  signing_key:
127
126
  specification_version: 4
128
- summary: test-cmd.rb provides access to the output streams (both stdout and stderr)
129
- of a spawned process.
127
+ summary: An object-oriented interface for spawning a process.
130
128
  test_files: []