Class: Minitar::Output

Inherits:
Object
  • Object
show all
Defined in:
lib/minitar/output.rb

Overview

Wraps a Minitar::Writer with convenience methods and wrapped stream management. If the stream provided to Output does not support random access, only Writer#add_file_simple and Writer#mkdir are guaranteed to work.

Security Notice

Constructing a Minitar::Output will use Kernel.open if the provided output is not a readable stream object. Using an untrusted value for output may allow a malicious user to execute arbitrary system commands. It is the caller’s responsibility to ensure that the output value is safe.

This notice applies to Minitar::Output.open, Minitar::Output.tar, and Minitar::Output.new.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(output) ⇒ Output

Creates a new Output object. If output is a stream object that responds to #write, then it will simply be wrapped. Otherwise, one will be created and opened using Kernel#open. When Output#close is called, the stream object wrapped will be closed.

:call-seq:

Minitar::Output.new(io) -> output
Minitar::Output.new(path) -> output


68
69
70
71
72
73
74
75
# File 'lib/minitar/output.rb', line 68

def initialize(output)
  @io = if output.respond_to?(:write)
    output
  else
    ::Kernel.open(output, "wb")
  end
  @tar = Minitar::Writer.new(@io)
end

Instance Attribute Details

#tarObject (readonly)

Returns the Writer object for direct access.



78
79
80
# File 'lib/minitar/output.rb', line 78

def tar
  @tar
end

Class Method Details

.open(output) ⇒ Object

With no associated block, Output.open is a synonym for Output.new.

If a block is given, the new Output will be yielded to the block as an argument and the Output object will automatically be closed when the block terminates (this also closes the wrapped stream object). The return value will be the value of the block.

:call-seq:

Minitar::Output.open(io) -> output
Minitar::Output.open(io) { |output| block } -> obj


33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/minitar/output.rb', line 33

def self.open(output)
  stream = new(output)
  return stream unless block_given?

  # This exception context must remain, otherwise the stream closes on open
  # even if a block is not given.
  begin
    yield stream
  ensure
    stream.close
  end
end

.tar(output) ⇒ Object

Output.tar is a wrapper for Output.open that yields the owned tar object instead of the Output object. If a block is not provided, an enumerator will be created with the same behaviour.

:call-seq:

Minitar::Output.tar(io) -> enumerator
Minitar::Output.tar(io) { |tar| block } -> obj


53
54
55
56
57
58
59
# File 'lib/minitar/output.rb', line 53

def self.tar(output)
  return to_enum(__method__, output) unless block_given?

  Output.open(output) do |stream|
    yield stream.tar
  end
end

Instance Method Details

#closeObject

Closes the Writer object and the wrapped data stream.



84
85
86
87
# File 'lib/minitar/output.rb', line 84

def close
  @tar.close
  @io.close
end

#closed?Boolean

Returns false if the wrapped data stream is open.

Returns:

  • (Boolean)


81
# File 'lib/minitar/output.rb', line 81

def closed? = @io.closed?