Module: Gem::Util

Defined in:
lib/rubygems/util.rb

Overview

This module contains various utility methods as module methods.

Class Method Summary collapse

Class Method Details

.gunzip(data) ⇒ Object

Zlib::GzipReader wrapper that unzips data.



11
12
13
14
15
16
17
18
19
# File 'lib/rubygems/util.rb', line 11

def self.gunzip(data)
  require 'zlib'
  require 'rubygems/util/stringio'
  data = Gem::StringSource.new data

  unzipped = Zlib::GzipReader.new(data).read
  unzipped.force_encoding Encoding::BINARY if Object.const_defined? :Encoding
  unzipped
end

.gzip(data) ⇒ Object

Zlib::GzipWriter wrapper that zips data.



24
25
26
27
28
29
30
31
32
33
# File 'lib/rubygems/util.rb', line 24

def self.gzip(data)
  require 'zlib'
  require 'rubygems/util/stringio'
  zipped = Gem::StringSink.new
  zipped.set_encoding Encoding::BINARY if Object.const_defined? :Encoding

  Zlib::GzipWriter.wrap zipped do |io| io.write data end

  zipped.string
end

.inflate(data) ⇒ Object

A Zlib::Inflate#inflate wrapper



38
39
40
41
# File 'lib/rubygems/util.rb', line 38

def self.inflate(data)
  require 'zlib'
  Zlib::Inflate.inflate data
end

.popen(*command) ⇒ Object

This calls IO.popen where it accepts an array for a command (Ruby 1.9+) and implements an IO.popen-like behavior where it does not accept an array for a command.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rubygems/util.rb', line 48

def self.popen *command
  IO.popen command, &:read
rescue TypeError # ruby 1.8 only supports string command
  r, w = IO.pipe

  pid = fork do
    STDIN.close
    STDOUT.reopen w

    exec(*command)
  end

  w.close

  begin
    return r.read
  ensure
    Process.wait pid
  end
end

.silent_system(*command) ⇒ Object

Invokes system, but silences all output.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/rubygems/util.rb', line 72

def self.silent_system *command
  require 'thread'

  @silent_mutex ||= Mutex.new

  null_device = Gem.win_platform? ? 'NUL' : '/dev/null'

  @silent_mutex.synchronize do
    begin
      stdout = STDOUT.dup
      stderr = STDERR.dup

      STDOUT.reopen null_device, 'w'
      STDERR.reopen null_device, 'w'

      return system(*command)
    ensure
      STDOUT.reopen stdout
      STDERR.reopen stderr
    end
  end
end

.traverse_parents(directory) ⇒ Object

Enumerates the parents of directory.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/rubygems/util.rb', line 98

def self.traverse_parents directory
  return enum_for __method__, directory unless block_given?

  here = File.expand_path directory
  start = here

  Dir.chdir start

  begin
    loop do
      yield here

      Dir.chdir '..'

      return if Dir.pwd == here # toplevel

      here = Dir.pwd
    end
  ensure
    Dir.chdir start
  end
end